适配器模式

1.定义

适配器(Adapter) 模式标准定义:将一个类的接口转换成客户希望的另外一个接口.

维基百科-适配器模式

2.实现

适配器模式:

  • 目标(Target)角色: 定义了客户所期望的操作.目标角色可以是具体类或抽象类.该角色不可缺少.
  • 源(Adaptee)角色: 这是我们原有的产品,也是需要被适配的产品.
  • 适配器(Adapter)角色: Adapter对Adaptee接口与Target接口进行适配,适配器把源接口转换成目标接口,在Target目标角色与Adaptee源角色之间提供一种过渡,即把Adaptee源角色所提供的接口转换为Target目标角色所提供的接口.

2.1 对象适配器和类适配器

对象适配器的实现 依赖于对象组合.就如同前面的实现示例,都是采用的对象组合的方式.也就是前面讲述的都是对象适配器实现的方式.

类适配器的实现 采用多重继承对一个接口与另一个接口进行匹配.由于java不支持多重继承,所以可以实现Target接口并继承Adaptee类或者反之也行. 结构图

2.2 示例

public class Source {  

    public void method1() {  
        System.out.println("this is original method!");  
    }  
}  

public interface Targetable {  

    /* 与原类中的方法相同 */  
    public void method1();  

    /* 新类的方法 */  
    public void method2();  
}  

public class Adapter extends Source implements Targetable {  

    @Override  
    public void method2() {  
        System.out.println("this is the targetable method!");  
    }  
}

public class AdapterTest {  

    public static void main(String[] args) {  
        Targetable target = new Adapter();  
        target.method1();  
        target.method2();  
    }  
}

3.总结

类适配器和对象适配器的权衡取舍

  • 实现上
    • 类适配器使用对象继承的方式,是静态的定义方式
    • 对象适配器使用对象组合的方式,是动态组合的方式.
  • 继承
    • 对于类适配器:由于适配器直接继承了Adaptee,使得适配器不能和Adaptee的子类一起工作,因为继承是一个静态的关系,当适配器继承了Adaptee过后,就不可能再去处理Adaptee的子类了.
    • 对于对象适配器:允许一个Adaptee和多个Adaptee,包括Adapter和它所有的子类一起工作.因为对象适配器采用的是对象组合的关系,只要对象类型正确,是不是子类都无所谓.
  • 适配器
    • 对于类适配器:适配器可以重定义Adaptee的部分行为,相当于子类覆盖父类的部分实现方法.
    • 对于对象适配器:要重定义Adaptee的行为比较困难,这种情况下,需要定义Adaptee的子类来实现重定义,然后让适配器组合子类.
  • Adaptee
    • 对于类适配器:仅仅引入了一个对象,并不需要额外的引用来间接得到Adaptee.
    • 对于对象适配器:需要额外的引用来间接得到Adaptee

适配器模式的优缺点

  • 更好的复用性
  • 更好的可扩展性
  • 过多的使用适配器,会让系统非常凌乱,不容易整体进行把握.(最好在后期的系统维护中才使用)

何时选用适配器模式

  • 如果你想要使用一个已经存在的类,但是它的接口不符合你的需求,你已经没有办法再去改这个接口,这种情况可以使用适配器模式,来把已有的实现转换成你需要的接口
  • 如果你想要创建一个可以复用的类,这个类可能和一些不兼容的类一起工作,这种情况可以使用适配器模式,到时候需要什么就适配什么.
  • 如果你想使用一些已经存在的子类,但是不可能对每一个子类都进行适配,这种情况可以选用对象适配器,直接适配这些子类的父类就可以了.

results matching ""

    No results matching ""