"亡羊补牢",聊聊适配器模式

设计模式-适配者模式

“事已至此,亡羊补牢”

何为适配器?

提高适配器,不知道你会想到什么?
也许我们会想到电源适配器,我们的笔记本电源线线上那个黑黑的小盒子就是电源适配器

电源适配器是用来解决电源接入和电源使用的差异问题

中国家庭接入的是220v的交流电,而笔记本往往使用的是小电压的直流电,因此肯定需要转换后使用

所谓适配器,就死为了解决差异化而产生的

现实例子

假设你是一个企业的老板,

现有一个不会说中文的外国客户,他需要了解产品的细节,需要产品的工程师去作详细的解答,

而工程师同样不会外语,那怎么进行交流呢?

答案很简单,当然是找翻译啊,但我们可以先分析一下其他的办法。

可以让外国客户学中文,但往往这是一个很离谱的请求,毕竟客户就是上帝,提出的时候客户就走了。

改变自己比改变别人容易,那让工程师学吧,但耗费的功夫太大了,客户不耐烦也走了。

在这个例子中,翻译就是适配者,他解决了客户和工程师之间的差异,同时又不需要让客户与工程师做修改。

代码结构

adapter.png

客户端接口

像客户一样,已经约定俗称,往往不方便变动

声明了抽象的业务方法

服务类

像工程师一样,对客户来说往往以为着是另一个体系

具有服务方法

适配器

像翻译一样,充当中间角色

具有服务类的成员变量

继承/实现了客户端接口,实现了业务方法,在业务方法中完成

  1. 调用服务类的服务方法
  2. 解决差异化

具体代码

根据实现例子结合适配器模式编写

外国客户

/**


 * 客户端接口 -> 外国客户
 */


public interface ForeignClient {
    void communicate();
}

翻译

/**


 * 适配者 -> 翻译
 */


public class Translater implements ForeignClient{
    private LocalEngineer localEngineer = new LocalEngineer();
    @Override
    public void communicate() {
        localEngineer.communicate();
        System.out.println("翻译正在翻译给外国客户听");
        System.out.println("外国客户已经理解,正在与翻译交流");
    }
}

本地工程师

/**


 * 服务类 -> 本地工程师类
 */


public class LocalEngineer {
    public void communicate() {
        System.out.println("本地工程师正在说中文");
    }
}

调用与结果

public static void main(String[] args) {
    ForeignClient foreignClient = new Translater();
    foreignClient.communicate();
}

image.png

模式优点

  1. 符合开放-封闭原则,只创建了适配器类,没有修改客户端。
  2. 符合单一职责原则,适配者承担了转化逻辑。
  3. 符合迪米特原则,客户端只需访问客户接口即可,不需要了解具体的服务类。

思维导图

image.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MY2nzg14' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片