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)输出展示

 

转载于:https://www.cnblogs.com/icmzn/p/5697190.html

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

  1. 23 DesignPatterns学习笔记:C++语言实现 --- 1.2 AbstractFactory

    23 DesignPatterns学习笔记:C++语言实现 --- 1.2 AbstractFactory 2016-07-21 (www.cnblogs.com/icmzn) 模式理解   1. F ...

  2. nltk和python的关系_NLTK学习笔记(一):语言处理和Python

    目录 nltk资料下载 import nltk nltk.download() 其中,download() 参数默认是all,可以在脚本里面加上nltk.download(需要的资料库) 来进行下载 ...

  3. C语言学习笔记---001C语言的介绍,编译过程原理,工具等

    C语言学习笔记---001C语言的介绍,编译过程原理,工具等 创梦技术交流平台:资源下载,技术交流,网络赚钱: 交流qq群:1群:248318056 2群:251572072 技术交流平台:cre.i ...

  4. IOS学习笔记07---C语言函数-scanf函数

    2013/8/7 IOS学习笔记07---C语言函数-scanf函数 ------------------------------ qq交流群:创梦技术交流群:251572072            ...

  5. IOS学习笔记07---C语言函数-printf函数

    IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...

  6. IOS学习笔记06---C语言函数

    IOS学习笔记06---C语言函数 --------------------------------------------  qq交流群:创梦技术交流群:251572072              ...

  7. IOS学习笔记05---C语言程序的开发运行过程

    IOS学习笔记05---C语言程序的开发运行过程 0 5.C语言3-C语言程序的开发运行过程 ----------------------------------------------------- ...

  8. IOS学习笔记03---C语言概述

    IOS学习笔记03---C语言概述 0 3.C语言1-C语言概述         qq交流群:创梦技术交流群:251572072                        创梦网络赚钱群:2483 ...

  9. x%3e=y%3e=z的c语言表达式,我的C语学习笔记-C语言教程(三).doc

    我的C语学习笔记- C语言教程(三) C语言教程---第一章: C语言概论 C语言教程---第二章: 数据类型.运算符.表达式 C语言教程---第三章: C语言程序设计初步 C语言教程---第四章: ...

最新文章

  1. 10分钟教你用睡觉这件事玩转贝叶斯推断
  2. QIIME 2教程. 14数据评估和质控q2-quality-control(2020.11)
  3. CISCO NAT 经典配置合集
  4. 修改C盘里windows\system32\etc里面的hosts文件并保存
  5. spring 自定义日志_Spring和Hibernate的自定义审核日志
  6. jmeter 采样器作用_实施自定义JMeter采样器
  7. 计算机机房建设目标是什么,计算机机房建设方案计划.doc
  8. 节目表演的点子_矿泉水桶当架子鼓,幼儿园小朋友出色表演,圈粉无数
  9. 【NOIP2018】【Luogu5019】铺设道路(贪心,差分)
  10. Linux源码安装Python3.7出现的各种坑
  11. 问题:子进程父进程哪个先执行:【转】关于 fork 和父子进程的理解
  12. do...while(); 语句在宏定义中的应用。
  13. poythoncode-实战4--读取文本文件,csv文件,存到系统中以大列表方式进行存储
  14. MyEclipse修改项目名称
  15. CentOS8下vi编辑器常用命令
  16. 计算机知识01:计算机基础知识入门
  17. 什么是运动控制,工业控制与自动化领域中运动控制器的作用是什么?- 顶控科技
  18. 最简单克隆虚拟机方法
  19. 微软翻译离线简体中文服务器,微软翻译新增离线翻译功能,但使用体验并没有想象中的好...
  20. php html 字符串 转 数组 用于小程序转换

热门文章

  1. python对财务人员的帮助-帮公司财务妹子写了个“群发工资条”的Python脚本!
  2. python制作excel表格-excel表格中怎么制作一份燃尽图表
  3. python怎么画条形图-python绘制条形图方法代码详解
  4. python语言特点有哪些-Python是什么?Python有什么特点?
  5. python基本使用-python基本用法
  6. python开发的优秀界面-tkinter python(图形开发界面)
  7. python基础题库-Python题库
  8. 我在学python-你们以为我在学C++?其实我在学 Python
  9. php和python哪个学起来简单一点-作为初学者,php,python和ruby应学哪个?
  10. python中是干嘛的-你都用Python来做什么,它对你来说有什么作用?