当前位置: 首页 > article >正文

二十三种设计模式之适配器模式

1. 设计模式的分类

创建型模式(五种):工厂方法模式、单例模式、抽象工厂模式、原型模式、建造者模式。
结构型模式(七种):适配器模式、代理模式、装饰器模式、桥接模式、外观模式、享元模式、组合模式。
行为型模式(十一种):状态模式、模板方法模式、访问者模式、迭代子模式、责任链模式、备忘录模式、解释器模式、命令模式、中介者模式、观察者模式、策略模式。

2. 为什么要引入适配器模式?

在软件开发的海洋中,我们经常会遇到各种不同的系统和组件,它们可能由于设计时的考虑不周或技术演进导致接口不兼容。这时,适配器模式(Adapter Pattern)就成为了我们解决问题的利器。

3. 什么是适配器模式?

适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户端期望的另一个接口。适配器让那些接口不兼容的类可以一起工作,从而提高了类的复用性。

最常见的比喻是电源适配器。当你出国旅行时,可能会遇到电源插座与你的电子设备充电器不匹配的情况。这时,你需要一个电源适配器来转换插头的形状和电压,使得你的充电器能够适应当地的电源插座。在这个比喻中:

  • 目标接口:是你电子设备的充电器接口。
  • 被适配者:是目的地国家的电源插座。
  • 适配器:是实际的电源适配器,它连接了两者。

4. 适配器模式的分类

适配器模式主要分为两种类型:

  1. 类适配器模式:通过多重继承将一个类的接口转换成另一个接口。在不支持多重继承的语言中,通常使用组合的方式来实现。

  2. 对象适配器模式:通过创建一个包装对象,将请求从一个对象传递到另一个对象。

5. 类适配器模式

5.1 组件

  • Target(目标接口):客户端期望的接口。
  • Adaptee(被适配者):需要适配的类,其接口与目标接口不兼容。
  • Adapter(适配器):继承Adaptee并实现Target接口。

5.2 示例

假设我们有一个旧的系统,它提供了一个Adaptee类,该类有一个specificRequest方法。现在,我们需要在新的系统中使用这个类,但新系统的接口是Target接口,它期望有一个request方法。

// 目标接口
public interface Target {
    void request();
}

// 被适配者
public class Adaptee {
    public void specificRequest() {
        System.out.println("Specific Request");
    }
}

// 适配器
public class Adapter extends Adaptee implements Target {
    @Override
    public void request() {
        specificRequest();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Target target = new Adapter();
        target.request();
    }
}

在这个例子中,Adapter类继承了Adaptee类并实现了Target接口,使得原本不兼容的Adaptee类可以通过Adapter来满足Target接口的需求。

6. 对象适配器模式

6.1 组件

  • Target(目标接口):客户端期望的接口。
  • Adaptee(被适配者):需要适配的类。
  • Adapter(适配器):持有Adaptee的引用并实现Target接口。

6.2 示例

对象适配器模式与类适配器模式的主要区别在于,对象适配器模式使用组合而非继承。

// 目标接口
public interface Target {
    void request();
}

// 被适配者
public class Adaptee {
    public void specificRequest() {
        System.out.println("Specific Request");
    }
}

// 适配器
public class Adapter implements Target {
    private Adaptee adaptee;

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

    @Override
    public void request() {
        adaptee.specificRequest();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Adaptee adaptee = new Adaptee();
        Target target = new Adapter(adaptee);
        target.request();
    }
}

7. 适配器模式的应用场景

适配器模式通常用于以下场景:

  1. 系统需要使用一些现有的类,而这些类的接口不符合系统的需要。
  2. 想要建立一个可重复使用的类,用来与一些彼此之间没有太大关系的类一起工作,包括一些可能在将来引进的类。

8. 适配器模式的优点

  • 提高类的复用性:通过适配器模式,我们可以重用现有的类,而不需要修改它们的代码。
  • 解耦系统组件:适配器模式提供了一个中间层,使得系统组件之间的依赖关系减少,提高了系统的灵活性。

9. 适配器模式的缺点

  • 增加系统的复杂性:如果过度使用适配器模式,可能会使得系统结构变得复杂,增加理解和维护的难度。

10. 结论

适配器模式是一种强大的设计模式,它可以帮助我们在不修改原有代码的情况下,实现不同系统或组件之间的协同工作。通过合理地使用适配器模式,我们可以提高软件的复用性和灵活性,但也要注意避免过度使用,以免增加系统的复杂性。


http://www.kler.cn/a/308769.html

相关文章:

  • HTTP协议基础
  • 探索Pillow库:Python图像处理的瑞士军刀
  • 94个属于一区且接受医工交叉领域投稿的期刊汇总|个人观点·24-11-13
  • 【Linux】TCP原理
  • 人脸识别技术:从算法到深度学习的全面解析
  • 开源 2 + 1 链动模式、AI 智能名片、S2B2C 商城小程序在用户留存与品牌发展中的应用研究
  • 单调队列,LeetCode 2398. 预算内的最多机器人数目
  • ai 回答HFS是什么 HTTP的文件服务器是什么
  • 数据结构之排序算法的分析和应用
  • 【数据结构篇】~链表算法题3(环形链表)
  • C# net跨平台上位机开发(avalonia)附demo源码
  • 牛客背包问题练习 xinjun与阴阳师
  • 苍穹外卖学习笔记(八)
  • 【案例71】配置https之后 IE打不开登陆页面 Uclient没有问题
  • 《微信小程序实战(2) · 组件封装》
  • 【重学 MySQL】二十七、七种 join 连接
  • 宝塔Linux部署 Vue + Spring Boot + MySQL + Redis
  • Parallels Desktop 20 for Mac 正式发布,更新了哪些新功能(附下载链接)!
  • 深度学习驱动超材料设计领域发展
  • 用Inno Setup打包QT程序输出安装包
  • 消息队列的幂等问题解决方案
  • 51单片机+proteus+学习3(串口、矩阵按键)
  • 了解华为云容器引擎(Cloud Container Engine)
  • 关于http的206状态码和416状态码的意义、断点续传以及CORS使用Access-Control-Allow-Origin来允许跨域请求
  • 网络运维故障处理案例
  • 武汉传媒学院联合创龙教仪建设DSP教学实验箱,基于DSP C6000平台搭建