设计模式之适配器模式

写在前面

适配器设计模式属于结构型设计模式的一种,本文一起来看下。

1:介绍

1.1:什么时候适配器设计模式

当现有接口客户端无法直接调用时,我们可以考虑适配器设计模式,来定义一个能够供客户端直接调用的接口,并在其中进行自动的适配(这也是适配器设计模式的核心)

1.2:UML类图

原型设计模式,包含如下元素:

复制代码
1:Adaptee
    现有接口,该接口无法直接满足客户端需求。
2:Target
    适配接口,客户端可以直接调用
3:Adapter
    实现适配接口Target,提供适配,并最终调用Adaptee
4:Client
    客户端类,即使用者

具体分为类适配模式和对象适配模式,其中类适配模式是适配器类同样实现目标接口,从而直接调用,对象适配模式是通过组合现有接口的方式,对象适配模式UML图如下:

对象适配模式UML图如下(区别就是不再实现Target接口而是组合)

2:实例

源码

2.1:场景

现在有一个接口有一个方法需要一个List<String>的参数,但是客户端只能提供逗号分割的字符串作为参数,这样就可以定义一个接受逗号分割的字符串参数的接口,并提供实现进行适配。

2.2:程序

  • 现有接口和实现类
java 复制代码
// 现有接口
public interface Adaptee {
    void tellMeYourDream(List<String> list);
}

// 现有接口实现类
public class AdapteeImpl implements Adaptee {
    public void tellMeYourDream(List<String> list) {
        System.out.println("你的梦想列表:" + list);
    }
}
  • 适配接口
java 复制代码
// 客户端需要的接口
public interface Target {
    // 以逗号分割的字符串
    void tellMeYourDream(String content);
}
  • 类适配模式
java 复制代码
// 客户需要的接口实现类,即适配器类(注意这里extends AdapteeImpl就是类适配模式的来源)
public class TargetClassAdapter extends AdapteeImpl implements Target {
    public void tellMeYourDream(String content) {
        // 客户给的是逗号分割的字符串,这里适配成现有接口需要的List
        List<String> listResult = Splitter.on(",").splitToList(content);
        // 适配完成,调用现有类的方法
        super.tellMeYourDream(listResult);
    }
}

测试:

java 复制代码
@Test
public void classadapter() {
    Target target = new TargetClassAdapter();
    target.tellMeYourDream("世界和平,见到想见的人,平平淡淡");
}

你的梦想列表:[世界和平, 见到想见的人, 平平淡淡]
  • 对象适配模式
java 复制代码
// 客户需要的接口实现类,即适配器类
public class TargetObjectAdapter implements Target {
    private Adaptee adaptee;

    public TargetObjectAdapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    public void tellMeYourDream(String content) {
        // 客户给的是逗号分割的字符串,这里适配成现有接口需要的List
        List<String> listResult = Splitter.on(",").splitToList(content);
        // 适配完成,调用现有类的方法
//        super.tellMeYourDream(listResult);
        this.adaptee.tellMeYourDream(listResult);
    }
}

测试:

java 复制代码
@Test
public void objectadapter() {
    Target target = new TargetObjectAdapter(new AdapteeImpl());
    target.tellMeYourDream("世界和平,见到想见的人,平平淡淡");
}

你的梦想列表:[世界和平, 见到想见的人, 平平淡淡]

写在后面

参考文章列表

一文彻底弄懂适配器模式(Adapter Pattern)

相关推荐
NG4775 小时前
【软件设计与体系结构】-策略设计模式
java·设计模式·软件工程
CaffeinePro6 小时前
SOLID五大设计原则:重构优雅代码与架构的底层规范
设计模式·架构
饮茶三千7 小时前
电子保函模板编辑器实战二:HTML→FTL 编译转换的设计与实现
前端·vue.js·设计模式
Kel7 小时前
Node.js 本质:从全脉络视角理解运行时原理
javascript·设计模式·node.js
码哥字节9 小时前
11 万 Star 的 Spec Kit,90% 的工程师只用它解决了 10% 的问题
设计模式·vibe coding·github spec kit
我登哥MVP9 小时前
走进 Gang of Four 设计模式:访问者模式
java·设计模式·访问者模式·原型模式
ttod_qzstudio10 小时前
【软考设计模式】状态模式:状态驱动行为自动转换与代码填空精讲
设计模式·状态模式
饮茶三千11 小时前
基于 WangEditor 的富文本编辑器定制实践
前端·vue.js·设计模式
ttod_qzstudio12 小时前
【软考设计模式】中介者模式:网状交互的解耦与集中调度精讲
设计模式·中介者模式
饼干哥哥1 天前
一夜之间,全世界的 Agent 能力提高了一个档次
设计模式·agent·代码规范