全网最简单的设计模式讲解方式:漫画适配器模式

476 阅读4分钟

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 ![在这里插入图片描述](img-blog.csdnimg.cn/20191120221… 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

适配器模式:

将一个类的接口,转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。

官方定义不太好理解,我翻译一下,在适配器模式中,可以通过创建适配器进行接口转换,让不兼容的接口变成兼容。 比如中国人家庭里面都用的国标的充电器,那插座肯定也是国标的,不然没有办法充电,但是当你买了一个港行的ipad的时候,他的充电器却是港版插头,为了能够正常充电,我们就需要买一个适配器(adapter),让港版插头也能够用在国标的插座上,对于用户来讲,他就把港版插头当做国标的插头来用。 如下图: 在这里插入图片描述

采用适配器模式的UML图: 在这里插入图片描述

通过UML图可以看到,适配器模式主要关联三个角色:

Target(目标接口):用户目标接口,即用户需要执行的动作。
Adapter(适配器类):通过实现目标接口,并持有被适配者的引用,把用户对目标接口的动作,委托给被适配者执行。
Adaptee(被适配者接口):这个接口需要适配。

目标接口:

/**
 * @Author: 欢迎关注公众号:程序员小安
 * @description: 国标充电器标准
 * @CreateDate: 2019/11/20
 * @Version: 1.0
 */
public interface ChinaPlugTarget {
    /**
     * 通过中国标准供电
     */
    void  powerWithChinastandard();
}

目标对象

/**
 * @Author: 欢迎关注公众号:程序员小安
 * @description:国标充电头
 * @CreateDate: 2019/11/20
 * @Version: 1.0
 */
public class ChinaPlug implements ChinaPlugTarget {
    @Override
    public void powerWithChinastandard() {
        System.out.println("使用国标充电头供电");
    }
}

被适配接口

/**
 * @Author: 欢迎关注公众号:程序员小安
 * @description: 港行充电器标准
 * @CreateDate: 2019/11/20
 * @Version: 1.0
 */
public interface HongkongPlugAdaptee {
    /**
     * 通过香港标准供电
     */
    void  powerWithHongkongstandard();
}

被适配者

/**
 * @Author: 欢迎关注公众号:程序员小安
 * @description:港行充电头
 * @CreateDate: 2019/11/20
 * @Version: 1.0
 */
public class HongkongPlug implements HongkongPlugAdaptee {
    @Override
    public void powerWithHongkongstandard() {
        System.out.println("使用港行充电头供电");
    }
}

适配器

/**
 * @Author: 欢迎关注公众号:程序员小安
 * @description:适配器
 * @CreateDate: 2019/11/20
 * @Version: 1.0
 */
public class ChinaPlugAdapter implements ChinaPlugTarget {
    private HongkongPlugAdaptee hongkongPlugTarget;

    public ChinaPlugAdapter(HongkongPlugAdaptee hongkongPlugTarget) {
        this.hongkongPlugTarget = hongkongPlugTarget;
    }

    @Override
    public void powerWithChinastandard() {
        hongkongPlugTarget.powerWithHongkongstandard();
    }
}

用户

public class User {
    public static void main(String[] args){
        ChinaPlug chinaPlug = new ChinaPlug();
        chinaPlug.powerWithChinastandard();

        HongkongPlug hongkongPlug = new HongkongPlug();
        ChinaPlugTarget chinaPlugAdaptee = new ChinaPlugAdapter(hongkongPlug);
        chinaPlugAdaptee.powerWithChinastandard();
    }
}

运行结果:

使用国标充电头供电
使用港行充电头供电

使用适配器的过程如下: 1.用户通过目标接口调用适配器的方法对适配器发出请求。 2.适配器使用被适配器接口把请求转换成被适配者的一个或多个调用接口。 3.客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用。

采用适配器模式后,对于用户来说,他完全感知不到他在使用港行插头,用户可以很简单的把港版插头当做国标的插头来用。国标充电器标准接口是目标接口,港行充电头是被适配者,适配器实现目标接口,并且持有被适配器的引用,当用户调用适配器的目标方法时,其实是委托给被被适配器去执行。 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

![在这里插入图片描述](img-blog.csdnimg.cn/20191121195… 类适配器 Adapter 类继承Adaptee (被适配类),同时实现Target 接口(因为 Java 不支持多继承,所以只能通过接口的方法来实现多继承)

对象适配器 Adapter类实现Target 接口,并持有Adaptee的引用,利用组合的方式将请求传递给被适配者。

适配器模式的优点 (1)通过创建适配器进行接口转换,让不兼容的接口变成兼容,这可以让目标类和适配者类解耦。 (2)灵活性和扩展性都非常好,符合开闭原则,我们想要改变接口时,适配器可以将改变的部分封装起来,用户不必为了应对不同的接口而每次跟着修改。 (3)使用对象组合,由于适配器持有被适配者的接口,而不是具体实例,也就是,被适配者的任何子类,都可以搭配着该适配器使用。

什么时候使用: 1 系统需要使用现有的类,而这些类的接口不符合系统的需要。 2 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。 3 需要一个统一的输出接口,而输入端的类型不可预知。


微信搜索【程序员小安】“面试系列(java&andriod)”文章将在公众号同步发布。