23 DesignPatterns学习笔记:C++语言实现 --- 2.2 Adapter

2016-07-22

(www.cnblogs.com/icmzn)



模式理解

1. Adapter 定义
    将一个类的接口变换为客户端所期待的另一种接口形式,使被适配者Adaptee能用用在目标target的环境中
    一般可以分为以下角色:
    (1)Target角色:
        定义把其他类或者对象转化为的目标接口。通常为一个抽象类(接口)。
    (2)Adaptee角色:
        定义被转化的类,它是已经存在的类或者对象
    (3)Adapte角色:
        通过继承Adaptee或者关联组合Adaptee的方式,适配Target目标
    通常适配器实在系统维护后期的系统扩展应用的。

2. Adapter 优点
(1)强两个没有关系的类适配在一起使用使用。提高复用度,维护系统容易,灵活性好。
(2)增加透明度,即把taget的接口实现,委托给了具体的adaptee完成。

3. Adapter 适应条件
(1)系统扩展后期,使用一个现有类或者原来的类,适配新接口或者原来的接口的时候。

4. Adapter 讨论与注意问题
(1)适配器模式的两种实现方式区别:类继承适配器方式与对象适配器方式
    这是面向对象领域的重要概念。
    类继承适配器是通过继承Adaptee方式(private)获取Adaptee的接口以及实现,
即如果以private继承则只获取了实现,如果以public继承则同时也获取了接口,父类接口可以在子类中提供服务。
则可以通过纯虚类继承实现接口继承。
    对象适配器方式,是通过Adapter组合的方式通过adaptee成员获取相应的接口内容,然后适配目标对象的接口。
(2)类继承适配器是类之间的继承关系;而对象适配器是类之间通过组合形成的关联关系。



程序实现(C++)

Adapte.h

 1 #pragma once
 2
 3 //适配器定义
 4 /*
 5     两种适配器定义
 6     (1)类适配器方式:adapter私有继承adaptee(或抽象类),并实现target的接口(继承抽象类)
 7     (2)对象适配器方式:datapter组合adaptee对象,并实现target的接口(继承抽象类)
 8 */
 9 #include "TargetAdptee.h"
10
11 class CClassAdepter :public CAdbTarger, private CAdeptee
12 {
13 public:
14     CClassAdepter(int age) :CAdeptee(age){};
15 public:
16     void request() override
17     {
18         //调用类适配器的被适配者
19         doMyWay();
20     }
21
22 };
23
24
25 class CObjectAdatper : public CAdbTarger
26 {
27 public:
28     CObjectAdatper()
29     {
30         m_pAdaptee = nullptr;
31     };
32
33     CObjectAdatper(CAdeptee* pAdaptee)
34     {
35         m_pAdaptee = pAdaptee;
36     }
37     ~CObjectAdatper()
38     {
39         delete m_pAdaptee;
40     }
41 public:
42     void request() override
43     {
44         _ASSERT(m_pAdaptee);
45         //调用类适配器的被适配者
46         m_pAdaptee->doMyWay();
47     }
48
49
50 private:
51     CAdeptee* m_pAdaptee;
52
53 };

TargetAdptee

 1 #pragma once
 2
 3 #include <iostream>
 4 using namespace std;
 5 //目标类,被适配类
 6 class CAdbTarger
 7 {
 8 public:
 9     virtual void request() = 0;
10 };
11
12 class CAdeptee
13 {
14 public:
15     CAdeptee(int age) :m_iAge(age){};
16 public:
17     //被适配的方法
18     void doMyWay()
19     {
20         cout << "我的借口实现,以adeptee方式实现...." << m_iAge << endl;
21     }
22 private:
23     int m_iAge;
24 };


(1)模板应用

main.cpp

 1 // Adapter.cpp : 定义控制台应用程序的入口点。
 2 //
 3
 4 #include "stdafx.h"
 5 #include "AdepterDef.h"
 6 #include <iostream>
 7 using namespace std;
 8
 9 int _tmain(int argc, _TCHAR* argv[])
10 {
11     cout << "类适配器方式" << endl;
12     CClassAdepter* pAdapter = new CClassAdepter(26);
13     pAdapter->request();
14     delete pAdapter;
15     cout << "对象适配器方式" << endl;
16     CObjectAdatper *pObj = new CObjectAdatper(new CAdeptee(28));
17     pObj->request();
18     delete pObj;
19
20     system("pause");
21     return 0;
22 }

(2)输出展示

 

时间: 2024-10-12 17:27:43

23 DesignPatterns学习笔记:C++语言实现 --- 2.2 Adapter的相关文章

23 DesignPatterns学习笔记:C++语言实现 --- 2.7 Proxy

2016-07-18 (www.cnblogs.com/icmzn) 模式理解   1. Proxy 代理模式    为其他对象提供一种代理可以间接控制这个对象的访问.    又称为“委托模式”,其他设计模式也是在代理模式的基础上扩展的,如“策略模式”“状态模式”“访问者模式”,代理模式的特殊应用.在Spring的AOP技术,以及Struts的From元素映射就是代理行为.    一般代理具有多种版本(扩展)如:普通代理模式,强制代理模式,动态代理模式    一般代理的角色:    (1)CAb

23 DesignPatterns学习笔记:C++语言实现 --- 1.5 Prototype

2016-07-21 (www.cnblogs.com/icmzn) 模式理解 1. Prototype  原型模式定义    提供了类的自我复制的能力,即通过已有对象进行新对象的创建.因为原型模式实在内存中进行二进制流的拷贝,所以比直接通过new 一个对象性能好.不同的实现方式与具体的语言相关. 2. 原型模式的优点(1)性能优良,实在内存中基于二进制的拷贝(2)在进行原型模式的时候,并不通过构造函数. 3. 原型模式的适用场景(1)需要根据已有对象创建大量的对象:(2)某个对象的创建需要有大

23 DesignPatterns学习笔记:C++语言实现 --- 2.4 Composite

2016-07-22 (www.cnblogs.com/icmzn) 模式理解   1. Composite组合模式    又称为部分整体模式,主要用来描述部分与整体的关系.    将对象组合成树状结构以表示“部分-整体”的层次结构,是用户对“单个对象”和“组合对象”的使用具有一致性.    一般该模式具有三个角色:    (1)AbsComponent角色:一般为抽象父类,抽象“单个对象”“组合对象”公共的行为和方法,可以提供一些默认的方法或行为实现.    (2)Leaf角色:描述的是“单个

23 DesignPatterns学习笔记:C++语言实现 --- 2.6 Facade

2016-07-22 (www.cnblogs.com/icmzn) 模式理解   1. 门面模式 facade ,又称为外观模式    要求所有外部与一个子系统的所有通信必须通过一个“统一的对象”进行.这个对象就是子系统的“门面”,即门面提供一个统一的调用接口,使得    子系统能够简单使用.    门面模式注重“统一的对象”,除了这个统一的对象外,不允许以其他方式调用子系统的行为发生.子系统可以是一个类对象或者一组对象的集合,更直观的    讲不管子系统内是多么杂乱无章,只要“统一对象”是简

23 DesignPatterns学习笔记:C++语言实现 --- 2.1 Bridge

2016-07-22 (www.cnblogs.com/icmzn) 模式理解   1. Bridge模式的定义    将抽象与实现解耦,使两个可以独立的发生变化.桥接模式的重点在“解耦”.    一般桥接模式有以下四个角色    (1)“抽象角色的抽象”:通过组合保留“实现橘色”的引用.    (2)具体的“抽象角色”:通过组合引用的实现类,对实现类抽象进行操作处理.    (3)“实现角色的抽象”:抽象类,定义实现角色必须的动作和行为.    (4)具体的实现角色:完成实现类角色抽象的具体的

23 DesignPatterns学习笔记:C++语言实现 --- 2.5 Factory

2016-07-18 (www.cnblogs.com/icmzn) 模式理解   1. Flyweight 模式,即享元(共享单元)模式    Flyweeight是拳击比赛中的特有名词,称为“特轻量级别”,则在设计模式中指的的是类要轻量.类的粒度要细,可以实现细粒度类的复用,但没有缺乏共享的机制,即多线程下类不可复用.    享元模式,是“池技术”的重要实现方式,但二者并不等价.使用享元模式可以支持大量的细粒度的对象的共享.    因为创建太多的对象到程序中有损程序的性能,可以采用享元模式的

IOS学习笔记---C语言第四天

1 //?生成2个数组,每个数组都有10个元素,元素取值范围20-40之间,数组对应元素相 加,放到另外?一个数组中 2 #import <Foundation/Foundation.h> 3 4 int main(int argc, const char * argv[]) 5 { 6 7 int num1[10]={0},num2[10]={0},num3[10]={0}; 8 for (int i = 0; i<10; i++) { 9 num1[i]=arc4random()%2

iOS学习笔记---c语言第十一天

函数指针 一.函数指针定义 //函数声明:声明我是一个什么函数 //求两个数的和 //函数的类型:int (int x,int y) //即:我是一个返回值为整型,有两个整型参数的函数. //函数名是 sum int sum(int x,int y); 函数指针定义p是变量,其他是类型(通常没有形参a,b) //函数指针类型 int (*)(int x,int y) //描述:指向 返回值为 int 两个int参数 的 指针类型 //函数指针变量: p //初始值 : sum printf("%

iOS学习笔记---c语言第九天

高级指针 指向结构体变量的指针,称为结构体指针 可以使用->指向内容. %p打印地址 void pLenth(cPoint *p1,cPoint *p2) //求两点间的距离  用的开方函数sqrt()和平方函数pow(,) { float a = sqrt(pow((p1->x-p2->x), 2)+pow((p1->y-p2->y), 2)); printf("两点距离为%.2f\n",a); } //main.m中代码 #import <Fou