×

设计模式-适配器模式

96
特立独行的猪手
2017.04.26 09:44 字数 564

概念

适配器模式是将类的一个接口转换成用户所期待的目标接口,使得原本因接口不匹配无法再一起工作的两个类一起工作。

生活中我们也会遇到这样的场景,如港版iPhone手机的充电器需要附加一个电源适配器才能够正常使用国内的电源插孔。

适配器模式有两种不同的形式:类适配器模式对象适配器模式

角色

  • 目标角色(Target):用户所期待的目标接口
  • 源角色(Adaptee): 需要被适配的类
  • 适配者角色(Adapter): 通过包装被适配的对象,将原接口转换为用户所期待的目标接口

实现

目标角色实现

public interface Target {

    void method1();

    void method2();

}

Target接口实现目标角色,用户期待接口包含method1method2两个方法。

源角色实现

public class Adaptee {

    public void method1(){
        System.out.println("Adaptee method1");
    }
}

源角色Adaptee类只实现了method1方法,这和用户所期望的不同。所以这里需要引入适配器,去转换成用户所期待的目标接口。

适配器实现

对于适配器的实现可分为两种形式:类适配器模式对象适配器模式

类适配器模式
public class Adapter extends Adaptee implements  Target {

    public void method2() {
        System.out.println("Adapter method2");
    }
}

Adapter类通过继承源角色Adaptee,复用了父类method1方法,并实现Target接口中Adaptee类中没有的方法method2。从而转换为用户期待目标的接口。

对象适配器模式
public class Adapter implements Target {

    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    public void method1() {
        adaptee.method1();

    }

    public void method2() {
        System.out.println("Adapter method2");
    }

}

Adapter类直接实现了Target接口。Adapter类拥有一个Adaptee类的对象,将method1方法的实现委托给该对象实现。

总结

优点

  • 利用适配器后,使用这只需要调用一个接口即可。
  • 复用性强,复用了现有的类,无需修改源角色的类,使得目标接口和源角色解耦。
  • 更好的拓展性,一个适配器可以集成多个源角色来完成目标接口。

缺点

会使得系统之间的关系变的负责,过多的使用适配器模式,无疑增加代码阅读和理解成本。

设计模式
Web note ad 1