适配器(Adapter)模式

简介: 适配器(Adapter)模式

 定义:适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作

一. 适配器模式的两种形式:适配器模式有类的适配器模式和对象的适配器模式两种

1. 类的Adapter模式结构图

image.gif编辑

图2 对象的Adapter模式结构图

image.gif编辑

二. 类的Adapter模式的结构

我们还是以汽车类型为例子说明Adapter模式。现在有这样一个场景:假设我们在软件开发中要使用一个不同的汽车工厂实现,该汽车工厂实现有BMW和BYD两种方式,它提供给我们的API接口是Drive()方法,使用方法如下:

car.Drive("BMW!");

当软件系统开发进行到一半时,要生产BYD的模式进行生产时,使用方法如下:

car.Drive("BYD!");

image.gif编辑

这时也许我们会想到修改现在的汽车生产工具的API接口,但是由于版权等原因我们不能够修改它的源代码,此时Adapter模式便可以派上用场了

image.gif编辑

实现代码如下:

public class BMWAdapter:BMWCar,ICarTarget
{
    public void Drive()
    {
        Drive();
    }
}
public class BYDCarAdapter:BYDCar,ICarTarget
{
    public void Drive()
    {
        this.Drive();
    }
}

image.gif

public class App
{
    public static void Main()
    {
        ICarTarget car= new BMWCarAdapter();
        car.Drive("BMW..");
        ICarTarget car= new BYDCarAdapter();
        car.Drive("BYD..");
    }
}

image.gif

三. 对象的Adapter模式的结构

image.gif编辑

实现代码如下:

public class CarAdapter:ICarTarget
{
    private CarAdaptee _adaptee;
    public CarAdapter(CarAdaptee adaptee)
    {
        this._adaptee = adaptee;   
    }
    public void Write()
    {
        _adaptee.Drive();
    }
}

image.gif

与类适配器相比较,可以看到最大的区别是适配器类的数量减少了,不再需要为每一种具体的方式来创建一个适配器类。同时可以看到,引入对象适配器后,适配器类不再依赖于具体的BMWCar类和BYDCar类,更好的实现了松耦合。

再看一下客户端程序的调用方法:

public class App
{
    public static void Main()
    {
        ICarTarget car= new CarAdapter(new BMWCar());
        car.Drive("BMW..");
        ICarTarget  car= new CarAdapter(new BYDCar());
        car.Drive("BYD..");
    }
}

image.gif

文章下方有交流学习区!一起学习进步!也可以前往官网,加入官方微信交流群

创作不易,如果觉得文章不错,可以点赞收藏评论

你的支持和鼓励是我创作的动力❗❗❗

官网Doker 多克官网;官方旗舰店Doker 多克官方旗舰店

目录
相关文章
|
设计模式 Java API
重构旧代码的秘诀:用设计模式 - 适配器模式(Adapter)给Java项目带来新生
【4月更文挑战第7天】适配器模式是解决接口不兼容问题的结构型设计模式,通过引入适配器类实现目标接口并持有不兼容类引用,实现旧代码与新接口的协作。适用于处理兼容性问题、整合遗留代码和集成第三方库。应用时,识别不兼容接口,创建适配器类转换方法调用,然后替换原有引用。注意保持适配器简单、使用组合和考虑扩展性。过度使用可能导致系统复杂和维护成本增加,应谨慎使用。
321 4
|
算法 数据可视化 新能源
数字化营销助力哪吒汽车突破重围 进店率单月提升4倍
数字化营销助力哪吒汽车突破重围 进店率单月提升4倍
421 0
|
消息中间件 C语言 RocketMQ
消息队列 MQ操作报错合集之出现"Connection reset by peer"的错误,该如何处理
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
Ubuntu Unix Linux
在Ubuntu安装RPM文件
Ubuntu使用`apt`和`alien`工具安装软件。`deb`是Ubuntu的标准包格式,但通过`alien`可转换及安装`RPM`包。首先确保启用`Universe`源,然后安装`alien`。转换RPM包为DEB包,运行`sudo alien package_name.rpm`,接着用`sudo apt install package_name.deb`安装。直接安装RPM包可使用`sudo alien -i package_name.rpm`,但这种方法不推荐,可能导致依赖性冲突和系统不稳定。
631 10
|
JavaScript 测试技术
【sgGoogleTranslate】自定义组件:基于Vue.js用谷歌Google Translate翻译插件实现网站多国语言开发
【sgGoogleTranslate】自定义组件:基于Vue.js用谷歌Google Translate翻译插件实现网站多国语言开发
|
存储 人工智能 安全
AI 赋能 UGC 内容审核解决方案
AI 赋能 UGC 内容审核解决方案
|
存储 缓存 算法
大文件 MD5 SHA 校验时间优化之路
【8月更文挑战第12天】处理大文件的MD5与SHA校验时,可通过选择高效算法实现、分块读取处理文件、利用多线程并行处理、采用硬件加速及缓存校验结果等方式优化校验时间。例如,使用性能良好的加密库如`pycryptodome`替代Python的标准`hashlib`库;分块读取文件并逐块计算哈希值,减少内存占用;利用多线程处理不同文件块;若条件允许,使用硬件加速如Intel AES-NI指令集;以及缓存重复校验的文件哈希值避免重算。这些策略可显著提高校验速度和系统效率。
1053 1
|
机器学习/深度学习 算法 vr&ar
Theta方法:一种时间序列分解与预测的简化方法
Theta方法整合了两个基本概念:分解时间序列和利用基本预测技术来估计未来的价值。
521 0
|
XML Java API
54. 【Android教程】图片资源:Drawable
54. 【Android教程】图片资源:Drawable
316 0