适配器设计模式是为了要使用一个旧的接口,或许这个接口非常难用,或许是和新的更新的接口不兼容,所以须要设计一个适配器类,然后就能够让新旧的接口都统一。

就是这种一个图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2VuZGVuMjM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

比方我们有这种一个旧的类:

  1. class OldName
  2. {
  3. public:
  4. virtual void setName(string n) = 0;
  5. virtual string getName() = 0;
  6. };
  7.  
  8. class OldNameMetheds : public OldName
  9. {
  10. string name;
  11. public:
  12. OldNameMetheds(string n = "") : name(n)
  13. {
  14. }
  15.  
  16. void setName(string n)
  17. {
  18. name = n;
  19. }
  20.  
  21. string getName()
  22. {
  23. return name;
  24. }
  25. };

这样我们仅仅能设计一个字符串的名字。可是如今我们有一个新的类:

  1. //base class
  2. class NewName
  3. {
  4. public:
  5. virtual void setFirstName(string first) = 0;
  6. virtual void setLastName(string last) = 0;
  7. virtual string getFirstName() = 0;
  8. virtual string getLastName() = 0;
  9. };
  10.  
  11. class NewNameMethod : public NewName
  12. {
  13. protected:
  14. string first_name;
  15. string last_name;
  16. public:
  17. NewNameMethod(string first = "", string last = "") : first_name(first),
  18. last_name(last)
  19. {
  20. }
  21.  
  22. void setFirstName(string first)
  23. {
  24. first_name = first;
  25. }
  26.  
  27. void setLastName(string last)
  28. {
  29. last_name = last;
  30. }
  31.  
  32. string getFirstName()
  33. {
  34. return first_name;
  35. }
  36.  
  37. string getLastName()
  38. {
  39. return last_name;
  40. }
  41. };

旧类和新类就不兼容了。故此须要一个Adaptor接口类:

  1. //The real adaptor class
  2. class Old2NewNameAdaptor : public NewNameMethod
  3. {
  4. OldName *old;
  5. public:
  6. Old2NewNameAdaptor(OldName *o) : old(o)
  7. {
  8. string name = old->getName();
  9. unsigned i = 0;
  10. for (; i < name.size() && name[i] != ' '; i++)
  11. {
  12. first_name.push_back(name[i]);
  13. }
  14. for (i++; i < name.size(); i++) last_name.push_back(name[i]);
  15. }
  16. };

能够看到。该类继承了新类,而且自己主动处理了oldname,把oldname的内容转存进newname中了,中间就是多了一个自己主动转换的功能,并没有太多奇妙的东西。可是对于用户来说就方便非常多啦。

然后能够这样使用:

  1. void Adaptor_Run()
  2. {
  3. OldName *oldname = &OldNameMetheds();
  4. oldname->setName("Bill Gate");
  5.  
  6. //小心这样写会有错误:原来的名字就会变成空了。没保留NewName *old2new = &Old2NewNameAdaptor(oldname);原因:应该是由于这个是暂时变量。指针指向一个空的暂时变量。那么是没有数据的!
  7.  
  8. Old2NewNameAdaptor o2n(oldname);
  9.  
  10. NewName *old2new = &o2n;//这样写。结果正确!
  11.  
  12. cout<<"The first name is: "<<old2new->getFirstName()<<endl
  13. <<"The last name is : "<<old2new->getLastName()<<endl;
  14. }

这里的old2new是一个新类,能够使用这个新类操作旧类的数据了。

最后执行:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2VuZGVuMjM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

Design Pattern Adaptor 适配器设计模式的更多相关文章

  1. Design Pattern Iterator 迭代器设计模式

    这个设计模式感觉很easy,我们平时敲代码的时候也是常常须要调用iterator的,C++和Java都是. 所以感觉没什么特别的.就是须要模仿C++或者Java的iterator类的功能吧. 这里简单 ...

  2. Design Pattern Memo 备忘录设计模式

    本设计模式就是简单地记录当前状态.然后利用记录的数据恢复. 比方首先我们有一个类.类须要记录当前状态进行相关的工作的: class Memo; class Human { public: string ...

  3. design pattern Builder 生成器设计模式

    其实设计模式可以学习很有趣,你并不需要有这么难啃旱地FOG对我来说,当然,这些都是健康的骨骼啃啃. 在本文中,建造者模式设计一个搞笑的一幕.根据这一模型来学习功夫的方法,哈哈. 基类的第一,设计.那么 ...

  4. Design Pattern Command 命令设计模式

    这种设计模式是使用不同类的包裹不同的命令,达到什么样的命令执行什么操作. 有可能进一步利用map您最喜欢的对接命令字. 正在运行的类实际上已经包含了操作的所有需求,例如: class SuperMak ...

  5. Design Pattern Bridge 桥设计模式

    桥设计模式事实上就是一个简单的has a relationship.就是一个类拥有还有一个类,并使用还有一个类实现须要的功能. 比方遥控器和电视之间能够使用桥设计模式达到能够使用同一个遥控器控制多台电 ...

  6. Design Pattern ->Adaptor

    Layering & Contract Philosophy With additional indirection Adaptee object just is as a member. A ...

  7. Flyweight Design Pattern 共享元设计模式

    就是利用一个类来完毕多种任务.不用每次都创建一个新类. 个人认为这个设计模式在C++里面,好像能够就使用一个函数取代,利用重复调用这个函数完毕任务和重复利用这个类,好像几乎相同. 只是既然是一个设计模 ...

  8. [Design Pattern With Go]设计模式-工厂模式

    这次介绍的设计模式是工厂模式,这是一个比较常见的创建型模式.一般情况下,工厂模式分为三种:简单工厂.工厂方法和抽象工厂,下面慢慢举例介绍下. 简单工厂 考虑一个加密程序的应用场景,一个加密程序可能提供 ...

  9. [Design Pattern With Go]设计模式-单例模式

    定义 一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例模式.当某些数据只需要在系统中保留一份的时候,可以选择使用单例模式. 饿汉式 饿汉式的实现方式比较简单.在类加 ...

随机推荐

  1. Ncomputering 安装及参数设置

    1.加域 2.添加用户:系统属性---远程

  2. kissy延迟加载demo

    <!doctype html><html><head>    <meta charset="gbk"/>    <title& ...

  3. BZOJ 2560(子集DP+容斥原理)

    2560: 串珠子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 757  Solved: 497[Submit][Status][Discuss] ...

  4. 题解 洛谷 P3381 【【模板】最小费用最大流】

    发了网络流,再来一发费用流 能做费用流的,网络流自然做得来,但在这还是不要脸的安利一下自己的博客(里面也有网络流的题解): 点我 扯远了... 费用流,就是在不炸水管的情况下求源点到汇点的最小费用. ...

  5. 平凡主丛上的Yang-Mills理论

    本文是复旦大学由丁青教授的暑期课程“Yang-Mills理论的几何及其应用”所作笔记,会有少许修正. 所需基础: 多元微积分学 微分方程(常微分方程,数学物理方程) 曲线曲面论(初等微分几何) 以下是 ...

  6. 洛谷 P2040 打开所有的灯

    P2040 打开所有的灯 题目背景 pmshz在玩一个益(ruo)智(zhi)的小游戏,目的是打开九盏灯所有的灯,这样的游戏难倒了pmshz... 题目描述 这个灯很奇(fan)怪(ren),点一下就 ...

  7. Qt之QImageReader

    简述 QImageReader类为从文件或设备读取图像提供了一个独立的接口. 读取图像最常用的方法是通过构造QImage和QPixmap,或通过调用QImage::load()和QPixmap::lo ...

  8. win7笔记本设置wifi热点

    1.打开cmd 输入netsh wlan set hostednetwork mode=allow ssid=ACE-PC key=12345678 2.等待1-2分钟后,网络连接里会出现一个&quo ...

  9. hpuoj--校赛--与学妹滑雪(最短路+精度判断)

    问题 G: 感恩节KK专场--与学妹滑雪 时间限制: 1 Sec  内存限制: 128 MB 提交: 284  解决: 25 [提交][状态][讨论版] 题目描述 这周下的雪好大好大,不过这正和KK学 ...

  10. LeetCode SQL

    SQL查询练习一(From LeetCode) 1 select name,population,area 2 from World 3 where area > 3000000 or popu ...