(C++实现)——适配器模式(Adapter Pattern)

2024-06-15 02:58

本文主要是介绍(C++实现)——适配器模式(Adapter Pattern),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

解决的问题:

适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作。比如说我的hp笔记本,美国产品,人家美国的电压是110V的,而我们中国的电压是220V,要在中国能使用,必须找个变压器转一下电压才可以。这个变压器就是个适配器。

适配器模式有类适配器和对象适配器两种模式,我们将分别讨论。


类适配器:

由图中可以看出,Adaptee类没有Request方法,而客户期待这个方法。为了使客户能够使用Adaptee类,提供一个中间环节,即类Adapter类,Adapter类实现了Target接口,并继承自AdapteeAdapter类的Request方法重新封装了AdapteeSpecificRequest方法,实现了适配的目的。

因为AdapterAdaptee是继承的关系,所以这决定了这个适配器模式是类的。

该适配器模式所涉及的角色包括:

目标(Target)角色:这是客户所期待的接口。因为C#不支持多继承,所以Target必须是接口,不可以是类。
源(Adaptee)角色:需要适配的类。
适配器(Adapter)角色:把源接口转换成目标接口。这一角色必须是类

    简单实现:

[cpp]  view plain copy
  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. // "ITarget"  
  5. class Target  
  6. {  
  7. public:  
  8.     // Methods  
  9.     virtual void Request(){};  
  10. };  
  11.   
  12. // "Adaptee"  
  13. class Adaptee  
  14. {  
  15. public:  
  16.     // Methods  
  17.     void SpecificRequest()  
  18.     {  
  19.         cout<<"Called SpecificRequest()"<<endl;  
  20.     }  
  21. };  
  22.   
  23. // "Adapter"  
  24. class Adapter : public Adaptee, public Target  
  25. {  
  26. public:  
  27.     // Implements ITarget interface  
  28.     void Request()  
  29.     {  
  30.         // Possibly do some data manipulation  
  31.         // and then call SpecificRequest    
  32.         this->SpecificRequest();  
  33.     }  
  34. };  
  35.   
  36.   
  37. int main()  
  38. {  
  39.     // Create adapter and place a request  
  40.     Target *t = new Adapter();  
  41.     t->Request();  
  42.   
  43.     return 0;  
  44. }  

对象适配器:

从图中可以看出:客户端需要调用Request方法,而Adaptee没有该方法,为了使客户端能够使用Adaptee类,需要提供一个包装(Wrapper)类Adapter。这个包装类包装了一个Adaptee的实例,从而将客户端与Adaptee衔接起来。由于AdapterAdaptee是委派关系,这决定了这个适配器模式是对象的。

该适配器模式所涉及的角色包括:

目标(Target)角色:这是客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
源(Adaptee)角色:需要适配的类。
适配器(Adapter)角色:通过在内部包装(Wrap)一个Adaptee对象,把源接口转换成目标接口。

简单实现:

[cpp]  view plain copy
  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. // "ITarget"  
  5. class Target  
  6. {  
  7. public:  
  8.     // Methods  
  9.     virtual void Request(){};  
  10. };  
  11.   
  12. // "Adaptee"  
  13. class Adaptee  
  14. {  
  15. public:  
  16.     // Methods  
  17.     void SpecificRequest()  
  18.     {  
  19.         cout<<"Called SpecificRequest()"<<endl;  
  20.     }  
  21. };  
  22.   
  23. // "Adapter"  
  24. class Adapter : public Target  
  25. {  
  26. private:  
  27.     Adaptee *adaptee;  
  28.   
  29. public:  
  30.     Adapter()  
  31.     {  
  32.         adaptee = new Adaptee();  
  33.     }  
  34.   
  35.     // Implements ITarget interface  
  36.     void Request()  
  37.     {  
  38.         // Possibly do some data manipulation  
  39.         // and then call SpecificRequest    
  40.         adaptee->SpecificRequest();  
  41.     }  
  42. };  
  43.   
  44.   
  45. int main()  
  46. {  
  47.     // Create adapter and place a request  
  48.     Target *t = new Adapter();  
  49.     t->Request();  
  50.   
  51.     return 0;  
  52. }  

缺省适配器:

缺省适配器模式是一种特殊的适配器模式,但这个适配器是由一个抽象类实现的,并且在抽象类中要实现目标接口中所规定的所有方法,但很多方法的实现都是平庸的实现,也就是说,这些方法都是空方法。而具体的子类都要继承此抽象类。 

简单实现:

[cpp]  view plain copy
  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4.   
  5. class Target {   
  6. public:  
  7.     virtual void f1(){};   
  8.     virtual void f2(){};   
  9.     virtual void f3(){};     
  10. };  
  11.   
  12. class DefaultAdapter : public Target   
  13. {   
  14. public:  
  15.     void f1() {   
  16.     }   
  17.   
  18.     void f2() {   
  19.     }   
  20.   
  21.     void f3() {   
  22.     }   
  23. };  
  24.   
  25. class MyInteresting :public DefaultAdapter  
  26. {   
  27. public:  
  28.      void f3(){         
  29.         cout<<"呵呵,我就对f3()方法感兴趣,别的不管了!"<<endl;  
  30.     }   
  31. };  
  32.   
  33. int main()  
  34. {  
  35.     // Create adapter and place a request  
  36.     Target *t = new MyInteresting();  
  37.     t->f3();  
  38.   
  39.     return 0;  
  40. }  


实现要点:

1.Adapter模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况,在遗留代码复用、类库迁移等方面非常有用

2Adapter模式有对象适配器和类适配器两种形式的实现结构,但是类适配器采用多继承的实现方式,带来了不良的高耦合,所以一般不推荐使用。对象适配器采用对象组合的方式,更符合松耦合精神。

3Adapter模式的实现可以非常的灵活,不必拘泥于GOF23中定义的两种结构。例如,完全可以将Adapter模式中的现存对象作为新的接口方法参数,来达到适配的目的。

4Adapter模式本身要求我们尽可能地使用面向接口的编程风格,这样才能在后期很方便的适配


使用场景:

在以下各种情况下使用适配器模式:

1.系统需要使用现有的类,而此类的接口不符合系统的需要。

2.想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。

3.(对对象适配器而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。


LCL_data原创于CSDN.NET【http://blog.csdn.net/lcl_data/article/details/8780140】


参考资料:

1.http://www.cnblogs.com/zhenyulu/articles/39386.html

2.http://www.cnblogs.com/Terrylee/archive/2006/02/18/333000.html

这篇关于(C++实现)——适配器模式(Adapter Pattern)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1062245

相关文章

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Python实现PDF按页分割的技术指南

《Python实现PDF按页分割的技术指南》PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时,下面我们就来看看如何使用Python创建一个灵活的PDF分割工具吧... 目录需求分析技术方案工具选择安装依赖完整代码实现使用说明基本用法示例命令输出示例技术亮点实际应用场景扩

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

如何在Java Spring实现异步执行(详细篇)

《如何在JavaSpring实现异步执行(详细篇)》Spring框架通过@Async、Executor等实现异步执行,提升系统性能与响应速度,支持自定义线程池管理并发,本文给大家介绍如何在Sprin... 目录前言1. 使用 @Async 实现异步执行1.1 启用异步执行支持1.2 创建异步方法1.3 调用

Spring Boot配置和使用两个数据源的实现步骤

《SpringBoot配置和使用两个数据源的实现步骤》本文详解SpringBoot配置双数据源方法,包含配置文件设置、Bean创建、事务管理器配置及@Qualifier注解使用,强调主数据源标记、代... 目录Spring Boot配置和使用两个数据源技术背景实现步骤1. 配置数据源信息2. 创建数据源Be

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分