设计模式(七)几段代码搞明白适配器模式

  • 一文带你搞懂Java动态代理
  • 几分钟带你搞懂策略模式
  • 几分钟带你搞懂观察者模式
  • 一文彻底搞明白工厂和抽象工厂
  • 一文搞明白装饰者模式
  • 最全单例模式
  • 几段代码搞明白命令模式
  • 几段代码搞明白适配器模式
  • 一看就懂的外观模式
  • 一看就懂的模版方法模式
  • 几段代码搞懂迭代器模式
  • 一文搞懂明白状态模式

关于适配器模式的定义,我就直接引用Head First了:适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。 适配器模式的意图是进行接口的转换,这点很重要,这是区分装饰者模式的“扩展行为”和代理模式的“访问控制”的依据。

适配器模式

其实学设计模式,不能拘泥于格式,不能死记形式,重要的是要理解模式背后的意图,意图只有一个,但实现的形式却可能多种多样。这也就是为何那么多变体依然属于xx设计模式的原因。假如有硬件厂商提供一种智能音箱,其对外提供了“打开”和“关闭”两个接口:
设计模式(七)几段代码搞明白适配器模式_第1张图片
这是智能设备接口类

public interface Ihardware {
    void on();
    void off();
}

这是具体的智能音箱类

public class SpeakerBox implements Ihardware {
    @Override public void on() {
        System.out.println("打开音箱");
    }
    @Override public void off() {
        System.out.println("关闭音箱");
    }
}

现厂商对所属硬件进行了技术升级,发现“关闭”接口并不常用,所以替换成了“休眠”接口,现智能设备接口类2.0见下:

public interface Ihardware2 {
    void on();
    void sleep();
}

这是新版智能音箱类2.0具体类:

public class SpeakerBox2 implements Ihardware2 {
    @Override public void on() {
        System.out.println("体验版-打开音箱");
    }
    @Override public void sleep() {
        System.out.println("体验版-休眠音箱");
    }
}

公司A,一直是该厂商智能音箱的忠实用户,今天在将智能音箱从1.0升级到2.0后,发现已有的业务无法正常运行了。在痛斥硬件厂商私自更改公开接口外,公司A的工程师只能先进行紧急修复。

为了兼容老版本和尽可能少的代码改动,工程师老王提出:我们要将不兼容的接口变成兼容的接口。可怎么将2.0的接口转换成客户期待的1.0接口呢?适配器对象见下:

public SpeakerBox2Adapter implements Ihardware {
    private SpeakerBox2 mSb2;
    public SpeakerBox2Adapter(SpeakerBox2 sb2) {
        this.mSb2 = sb2;
    }
    @Override public void on() {
        mSb2.on();
    }
    @Override public void off() {
        /**
         * 当然这里可以进行一系列的转换逻辑。
         */
        mSb2.sleep();
    }
}

通过适配器对象,我们就能对SpeakerBox2 对象像SpeakerBox一样使用了。测试代码见下:

public class ClientTest {
    public static void main(String[] ags) {
        Ihardware hw1 = new SpeakerBox();
        Ihardware hw2 = new SpeakerBox2Adapter(new SpeakerBox2());
        // 接口调用
        hw1.on();
        hw1.off();
        hw2.on();
        hw2.off();
    }
}

你可能感兴趣的:(模式架构)