适配器模式

一、适配器模式介绍

1、定义与类型

定义:将一个类的接口转换成客户期望的另一个接口
使原本接口不兼容的类可以一起工作
类型:结构型

2、适用场景

已经存在的类,它的方法和需求不匹配时(方法结果相同或相似)
不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品、不同厂家造成功能类似而接口不相同情况下的解决方案

3、优点

能提高类的透明性和复用,现有的类复用但不需要改变
目标类和适配器类解耦,提高程序扩展性
符合开闭原则

4、缺点

适配器编写过程需要全面考虑,可能会增加系统的复杂性
增加系统代码可读的难度

5、扩展

对象适配器
类适配器

6、相关设计模式

适配器模式和外观模式

二、代码示例

1、类适配器模式:

被适配者类:

public class Adaptee {
    public void adapteeRequest(){
        System.out.println("被适配者的方法");
    }
}

目标接口:

public interface Target {
    void request();
}

具体目标类:

public class ConcreteTarget implements Target {
    @Override
    public void request() {
        System.out.println("concreteTarget目标方法");
    }
}

适配器类:

public class Adapter extends Adaptee implements Target{
    @Override
    public void request() {
        //...
        super.adapteeRequest();
        //...
    }
}

测试类:

public class Test {
    public static void main(String[] args) {
        Target target = new ConcreteTarget();
        target.request();

        Target adapterTarget = new Adapter();
        adapterTarget.request();
    }
}

类图:

2、对象适配器模式:

被适配者、目标接口、具体目标类以及测试类相同
适配器类:

public class Adapter implements Target{
    private Adaptee adaptee = new Adaptee();
    @Override
    public void request() {
        //...
        adaptee.adapteeRequest();
        //...
    }
}

类图:

3、模拟电源适配器:

被适配者类:

public class AC220 {
    public int outputAC220V(){
        int output = 220;
        System.out.println("输出交流电"+output+"V");
        return output;
    }
}

目标接口:

public interface DC5 {
    int outputDC5V();
}

适配器类:

public class PowerAdapter implements DC5{
    private AC220 ac220 = new AC220();

    @Override
    public int outputDC5V() {
        int adapterInput = ac220.outputAC220V();
        //变压器...
        int adapterOutput = adapterInput/44;

        System.out.println("使用PowerAdapter输入AC:"+adapterInput+"V"+"输出DC:"+adapterOutput+"V");
        return adapterOutput;
    }
}

测试类:

public class Test {
    public static void main(String[] args) {
        DC5 dc5 = new PowerAdapter();
        dc5.outputDC5V();
    }
}

类图:

三、源码示例

1、JDK

XmlAdapter

2、SPRING

AdvisorAdapter

posted @ 2020-05-26 06:50  weixiaokun  阅读(122)  评论(0编辑  收藏  举报