适配器模式(Adapter)

适配器模式(Adapter)

定义:适配器模式是把一个类的接口变换成客户端所期待的另一种接口,从而使原本因为接口不匹配而无法在一起工作的两个类能够在一起工作。

分类类适配器对象适配器。类适配器是把需要适配的类转换成目标类。对象适配器是把需要适配的类组合在适配器中,表现为被委派的关系。最后还有缺省适配模式。

类适配器的类图
适配器模式(Adapter)_第1张图片

类适配器代码示例

public class Plane {

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

}
public interface Ship {

    public void flow();

}
//类适配器
public class SeaPlane extends Plane implements Ship {

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

}
public class Main {

    /*
     * 客户想要一架飞机,但是又想要能在海上航行的飞机
     * 飞机本身不具有在海上航行的能力
     * 适配器航海飞机出现了,它继承飞机,本质上它是飞机 ,但是实现轮船的接口,由此可以在海上航行
     */
    public static void main(String[] args) {
        SeaPlane plane = new SeaPlane();
        plane.fly();
        plane.flow();
    }

}

对象适配器的类图
适配器模式(Adapter)_第2张图片

对象适配器代码示例

//对象适配器
public class SeaPlane2 implements Ship {

    private Plane plane;

    public SeaPlane2(){
        this.plane = new Plane();
    }

    @Override
    public void flow() {
        System.out.println("flow...");
    }

    public void fly(){
        this.plane.fly();
    }

}

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

  • 类适配器使用对象继承的方式,是静态的定义方式;而对象适配器使用对象组合的方式,是动态组合的方式。
  • 对于对象适配器,一个适配器可以把多种不同的源适配到同一个目标;对于类适配器,由于适配器直接继承了需要适配的类,使得适配器不能和需要适配的类的子类一起工作。
  • 对于对象适配器,要重定义需要适配的类的方法比较困难;对于类适配器,由于其继承了需要被适配的类,其天然就可以很方便地重写父类的方法。
  • 对于对象适配器,需要额外的引用空间;而类适配器不需要。

建议尽量使用对象适配器,多用组合少用继承。

缺点
  过多的使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。

缺省适配模式
  缺省适配(Default Adapter)模式为一个接口提供缺省实现,这样,子类型可以从这个缺省实现进行扩展,而不必从原有接口进行扩展。

缺省适配模式的类图
适配器模式(Adapter)_第3张图片

代码实例

public interface Human {

    public void eat();

    public void speak();

    public void think();

}
//平庸的实现类
public class Robot implements Human {

    @Override
    public void eat() {

    }

    @Override
    public void speak() {

    }

    @Override
    public void think() {

    }

}
public class Terminator extends Robot {

    public void think(){
        System.out.println("thinking how to kill enermies...");
    }

}

  与通常的适配器不同的是,此适配器Robot给出的所有方法都是“平庸的”,这种“平庸化”的适配器模式就称为缺省适配器模式。
  适配器模式的用意是要改变源的接口,以便于目标接口相容。缺省适配的用意稍有不同,它是为了方便建立一个不平庸的适配器类而提供的一种平庸实现。
  在任何时候,如果不准备实现一个接口的所有方法时,就可以使用“缺省适配模式”制造一个这个接口的实现类,给出所有方法的平庸的具体实现。这样,从这个类再继承下去的子类就不必实现所有的方法了。

你可能感兴趣的:(设计模式)