原文链接: 设计模式 适配器模式
上一篇: java 的 mysql 数据库 SqlHelper辅助类
下一篇: 设计模式 外观模式
单向适配器
双向适配器
package ahao.design;
/*
* 适配器模式
* 定义:
* 将一个类的接口转换成客户希望的另外一个接口,适配器模式使得原本由于接口不兼容
* 而不能一起工作的那些类可以一起工作
*
* 功能: 转换匹配,复用已有功能,可以在转换时适当调整参数
* 本质: 转换匹配,复用功能
*/
//适配器,将Adaptee适配为需要的Target
public class Adapter implements Target {
// 需要持有适配对象
Adaptee adaptee;
public Adapter(Adaptee adaptee) {
super();
this.adaptee = adaptee;
}
public static void main(String[] args) {
Adaptee adaptee = new AdapteeImp();
Adapter adapter = new Adapter(adaptee);
adapter.request();
}
@Override
public void request() {
adaptee.doSomething();
}
}
// 已存在并被实现的接口
interface Adaptee {
void doSomething();
}
class AdapteeImp implements Adaptee {
@Override
public void doSomething() {
System.out.println("adapteeImp");
}
}
// 特定的接口
interface Target {
void request();
}
// 双向适配器
class TwoWayAdapter implements Adaptee, Target {
// 持有两个接口
Adaptee adaptee;
Target target;
// 构造方法,传入两个适配对象
public TwoWayAdapter(Adaptee adaptee, Target target) {
super();
this.adaptee = adaptee;
this.target = target;
}
//相互适配
@Override
public void doSomething() {
target.request();
}
@Override
public void request() {
adaptee.doSomething();
}
}
功能主要是进行转换匹配, 目的是复用已有的功能, 而不是来实现新的接口
适配器的实现方式其实是依靠对象组合的方式,通过给适配器对象组合被适配的对象,然后当客户端调用Target的时候,适配器会把相应的功能委托给被适配的对象去完成
开发中适配器也可以实现一些Adaptee没有实现但是在Target中定义的功能,称为智能适配器.
可以适配多个Adaptee,也就是说实现某个新的Target的功能时,需要调用多个模块的功能,适配多个模块的功能才能满足新街口的要求
双向适配器
同时实现了Target和Adaptee的接口,使得双向适配器可以在Target或Adaptee被使用的地方使用, 已提供对所有客户的透明性,尤其是两个不同的客户需要用不同的方式查看同一个对象时,适合使用双向适配器
使用时机:
想使用一个已经存在但接口不符合所需标准的类
想创建一个可以复用的类,这个类可能和一些不兼容的类一起工作
相关模式:
适配器和桥接:
结构相似,功能完全不同
适配器模式是把两个或者多个接口的功能进行转换匹配, 而桥接模式是让接口和实现部分相分离,以便他们可以独立的变化
适配器和装饰模式
都使用的对象组合的方式, 都可以在转调组合对象的功能前后进行一些附加的处理,
一般适配器适配过后是需要改变接口的, 如果不改接口就没有必要适配了, 而装饰模式是不改接口的,无论多少层装饰器都是一个接口,因此装饰模式很容易支持递归
适配器和代理
两个可以组合使用, 在实现适配器的时候,可以使用代理来调用Adaptee, 这样可以获得更大的灵活性