设计模式随笔(七):适配器模式

概述

  以电源插座为例,有三孔插头和二孔插头,各个国家标准不一,国外版笔记本如果想在国内插上插头充电,我们肯定都会准备一个转接头将三孔插头/二孔插头转为跟笔记本电源插头来匹配,充上电。这是我们生活中的适配器。

  在java中,我们把一个类的接口转换成客户端想要的另一个接口(也就是把国内插孔,转为国外插孔),把因为接口不兼容而不能在一起工作的类,通过适配器(Adapter),是他们能够在一起工作。

UML

  把适配的类的API,转为目标类的API

 

类适配器

  Client想要调用-op2方法,但Adaptee并没有提供这个方法,为了使Target能提供-op2这个方法,添加一个中间环节Adapter类继承Adaptee,实现Target接口。因为Adapter和Adaptee是继承关系,决定这个适配器是类适配器

  

 

 

 

创建Targe接口

interface Target {
    //这是源类Adapteee没有的方法
    void operation_2();
}

创建原类

class Adaptee {
    public void opration_1() {

    }
}

创建适配器类

//适配器Adapter继承自Adaptee,同时又实现了目标(Target)接口。
class Adapter extends Adaptee implements Target {

    //这里的适配器只是将opration_1()方法作了一层封装,封装成Target可以调用的opration_2()而已
    @Override
    public void opration_2() {
        this.opration_1();
    }

}

Client调用

public class Test{

    public static void main(String[] args) {
        Target mAdapter = new Adapter();
        mAdapter.opration_2();
    }
}

  

 

对象适配器

  Adapter和Adaptee不再使用继承关系,而是通过委派关系连接到Adapter

  创建Target接口和Adaptee源类与类适配器模式相同,不同点在于Adapter代码。

class Adapter implements Target{
    // 直接关联被适配类  
    private Adaptee adaptee;

    // 可以通过构造函数传入具体需要适配的被适配类对象  
    public Adapter (Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void operation_2() {
        // 这里是使用委托的方式完成特殊功能  
        this.adaptee.opration_1();
    }
}  

  

 

Client调用

public class AdapterPattern {
    public static void main(String[] args) {
        // 步骤4:定义具体使用目标类,并通过Adapter类调用所需要的方法从而实现目标
        //需要先创建一个被适配类的对象作为参数  
        Target mAdapter = new Adapter(new Adaptee());
        mAdapter.operation_2();
    }
}

 

 

 

posted @ 2020-11-02 11:01  胡吃海喝的程序猿  阅读(102)  评论(0编辑  收藏  举报