适配器模式

2019/09/10 设计模式 共 1709 字,约 5 分钟

适配器模式

话说已经好久没有继续记录设计模式的demo了,因为上周正在紧张刺激的开发周,今天学习《Head First 设计模式》的第七章节:适配器模式

定义

Convert the interface of a class into another interface clients expect.Adapter lets classes work together that couldn’t otherwise because of incompatible interfaces.
将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作.

类图

图片来自百度百科

适配器模式类图

角色结构

Target目标角色:期望接口
Adaptee源角色:被转化的接口
Adapter适配器角色:将源角色装换为目标角色

实例

上周买了一个日版Ps4游戏机,结果货到了发现电源线是超大三角插头(当然是为了节目效果举的假例啦),家里的插座根本插不上,无奈又去店里买了一个电源适配器,这才玩上游戏。
在上面的例子中,Target目标角色是中国的插座,Adaptee源角色是日版Ps4游戏机的电源插头,Adapter适配器角色就是店里卖的电源适配器啦。

  1. 首先创建日版充电器类,这是一个Adaptee源角色,只能给日版设备充电
public class JapanesePlug {
    /**
     * 充电方法:只能给日版的设备充电
     */
    public void powerForJapanese() {
        System.out.println("给日版设备充电");
    }
}
  1. 创建中国充电器都需要实现的充电接口
public interface ChinesePlug {

    /**
     * 待实现接口,将其他设备的充电器转化为可以插入中国插座的
     */
    void powerForChinese();
}
  1. 然后创建适配器类,它实现ChinesePlug,并有一个JapanesePlug私有成员变量,通过构造器注入,然后调用powerForChinese方法做适配,实现给日版设备充电的功能。
public class PlugAdapter implements ChinesePlug {

    /**
     * 有一个日版充电器对象
     */
    private JapanesePlug japanesePlug;

    public PlugAdapter(JapanesePlug japanesePlug) {
        this.japanesePlug = japanesePlug;
    }

    /**
     * 待实现接口,将其他设备的充电器转化为可以插入中国插座的
     */
    @Override
    public void powerForChinese() {
        System.out.println("经过电源适配器的适配后");
        this.japanesePlug.powerForJapanese();
    }
}
  1. 创建测试类
public class Test {
    public static void main(String[] args) {
        // 拿到游戏机,发现插座不匹配不能充电
        JapanesePlug adaptee = new JapanesePlug();
        adaptee.powerForJapanese();
        System.out.println("警告:因为日版充电器不匹配中国插座,无法充电");
        //需要先创建一个被适配类的对象作为参数
        ChinesePlug target = new PlugAdapter(adaptee);
        target.powerForChinese();
    }
}
  • 测试结果为
给日版设备充电
警告:因为日版充电器不匹配中国插座,无法充电
经过电源适配器的适配后
给日版设备充电

适配器模式的优缺点

优点

  1. 适配器模式可以让两个没有任何关系的类在一起运行,只要适配器角色做好关联。
  2. 增加了类的透明性。
    • 目标角色的具体实现都委托给了源角色。
  3. 提高了类的复用度。
  4. 灵活性非常好,如果不想做适配了,删除适配器类就可以。

注意事项

一般适配器模式不是在详细设计阶段考虑的,它是一个满足二次需求的模式。

使用场景

当你有动机修改一个已经投产中的接口时,适配器模式可能是最适合你的模式。

源代码

GitHub地址

版权声明:本文为Planeswalker23所创,转载请带上原文链接,感谢。

文档信息

Search

    Table of Contents