设计模式学习与整理-适配器模式

介绍

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式。

举个简单的例子,读卡器作为电脑和内存卡的适配器,把内存卡放到读卡器中,再将读卡器插入电脑,电脑就可以读取内存卡的数据。

应用场景

1、系统需要使用现有的类,而此类的接口不符合系统的需要

模式结构

1. 目标(Target):目标是一个接口,该接口是客户想使用的接口。

2. 被适配者(Adaptee):被适配者是一个已经存在的接口或者抽象类,这个接口或者抽象类需要适配。

3. 适配器(Adapter):适配器是一个类,实现了目标接口,并且包含被适配者的引用,即适配器的职责是对被适配者接口与目标接口进行适配。(适配器类中有了被适配者的引用,就可以调用被适配者的方法与重写来的方法进行适配)

《设计模式学习与整理-适配器模式》

 

代码案例

现在用户已有一个两相的插座,但最近又有了一个三相插座。现有一台洗衣机和一台电视机,洗衣机按着三相插座的标准配有三相插头,而电视机按着两相插座的标准配有两相插头,现在用户想用新的三相插座来使用洗衣机和电视机,即用新的三相插座为洗衣机和电视机接通电流。

那么,三相插座类(ThreeElectricOutlet)就是目标(Target):

public interface ThreeElectricOutlet {
    void connectElectricCurrent();
}

接着,被适配者(Adaptee)是两相插座:

public interface TwoElectricOutlet {
    void connectElectricCurrent();
}

适配器类,实现了三相插座,并且包含了两相插座的引用变量,可以在重写三相插座的方法中进行调用两相插座的方法:

public class ThreeElectricAdapter implements ThreeElectricOutlet {

    // 定义一个二向插座的引用对象
    TwoElectricOutlet outlet;

    // 构造函数
    ThreeElectricAdapter(TwoElectricOutlet outlet) {
        this.outlet = outlet;
    }

    @Override
    public void connectElectricCurrent() {
        //通过二相插座引用对象调用其具体方法,实现二相插座通电
        outlet.connectElectricCurrent();
    }
}

电视机(TV)类:

public class TV implements TwoElectricOutlet {

    String name;

    TV () {
       name = "电视机";
    }

    @Override
    public void connectElectricCurrent() {
        turnOn();
    }

    public void turnOn() {
        System.out.println(name + "开始播放节目");
    }
}

测试:

public class ApplicationTest {

    public static void main(String[] args) {
        TV tv = new TV();
        // 把电视插在适配器上
        ThreeElectricAdapter adapter = new ThreeElectricAdapter(tv);
        System.out.println("使用三相插座接通电流");
        adapter.connectElectricCurrent();
    }
}

《设计模式学习与整理-适配器模式》

优点

1. 目标和被适配者是完全解耦关系。

2. 适配器模式满足“开-闭原则”。当添加一个实现Adaptee接口的新类时,不必修改Adapter,Adapter就能对这个新类的实例进行适配。

缺点

1. 目标类中的目标方法得是抽象的才能保证Adapter类重写了方法。

    原文作者:阿云_
    原文地址: https://blog.csdn.net/xcy1193068639/article/details/88912441
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞