“亡羊补牢”,聊聊适配器模式

2023年 7月 19日 46.7k 0

设计模式-适配者模式

“事已至此,亡羊补牢”

何为适配器?

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

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

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

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

现实例子

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

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

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

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

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

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

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

代码结构

adapter.png

客户端接口

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

声明了抽象的业务方法

服务类

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

具有服务方法

适配器

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

具有服务类的成员变量

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

  • 调用服务类的服务方法
  • 解决差异化
  • 具体代码

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

    外国客户

    /**
     * 客户端接口 -> 外国客户
     */
    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

    模式优点

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

    image.png

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论