适配器模式

一、定义

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

  • 举生活中的例子的话就比如 耳机的3.5mm转type的转接头,远古时期的读卡器等等。

  • 分类:由于Java只支持单继承,所以适配器模式也分为类适配器和对象适配器。

    • 类适配器:使用类间继承,只能通过复写原角色的方法进行扩展。
    • 对象适配器:使用类间关联进行耦合,设计时候比较灵活。

二、组成

类图: alt

  • 目标(Target)角色:我们所期望的接口(比如耳机转接头,typec口就是我们所期望的)。

  • **源(Adaptee)角色:**现在需要适配的接口。(耳机)

  • **适配器(Adaper)角色:**把源角色转换为目标角色,通过继承或是类的关联(转接头)。

三、优点

  • 让两个不适配的类能一起运行。
  • 提高代码的复用性。源目标角色正常运行而不需要修改内容(总不能没有转接口换一个typec口的耳机吧hh)。
  • 灵活使用,需要适配器就用,不想用就不用。

四、类适配器举例

适配器模式是在后期维护的时候考虑的设计模式,而不是在设计的时候考虑的设计模式。同时根据应用场景,适配器模式需要进行灵活的扩展。

五、代码

public class adp {
    public static void main(String[] args) {
        System.out.println("-------生成一个原角色-------");
        Adaptee adaptee = new Adaptee();
        adaptee.AdapteeMethod();
        System.out.println("-------生成一个目标角色-------");
        AdapterTarget target = new RealizeAdapterTarget();
        target.TargetMethod();
        System.out.println("-------定义由原角色转换来的目标角色-------");
        ClassAdapterTarget adapter = new ClassAdapterTarget();
        adapter.TargetMethod();
    }

}

/**
 * 源目标
 */
class Adaptee{
    public void AdapteeMethod(){
        System.out.println("原装方法");
    }
}

/**
 * 目标角色
 */
interface AdapterTarget {
    void TargetMethod();
}

/**
 *目标角色的实现类
 */
class RealizeAdapterTarget implements AdapterTarget {
    @Override
    public void TargetMethod() {
        System.out.println("目标角色具体的方法");
    }
}

/**
 * 适配器
 */
class ClassAdapterTarget extends Adaptee implements AdapterTarget {
    @Override
    public void TargetMethod() {
        System.out.println("通过适配器调用的原角色的方法");
        super.AdapteeMethod();
    }
}