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

就是这种一个图:

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

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

class OldName
{
public:
virtual void setName(string n) = 0;
virtual string getName() = 0;
}; class OldNameMetheds : public OldName
{
string name;
public:
OldNameMetheds(string n = "") : name(n)
{
} void setName(string n)
{
name = n;
} string getName()
{
return name;
}
};

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

//base class
class NewName
{
public:
virtual void setFirstName(string first) = 0;
virtual void setLastName(string last) = 0;
virtual string getFirstName() = 0;
virtual string getLastName() = 0;
}; class NewNameMethod : public NewName
{
protected:
string first_name;
string last_name;
public:
NewNameMethod(string first = "", string last = "") : first_name(first),
last_name(last)
{
} void setFirstName(string first)
{
first_name = first;
} void setLastName(string last)
{
last_name = last;
} string getFirstName()
{
return first_name;
} string getLastName()
{
return last_name;
}
};

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

//The real adaptor class
class Old2NewNameAdaptor : public NewNameMethod
{
OldName *old;
public:
Old2NewNameAdaptor(OldName *o) : old(o)
{
string name = old->getName();
unsigned i = 0;
for (; i < name.size() && name[i] != ' '; i++)
{
first_name.push_back(name[i]);
}
for (i++; i < name.size(); i++) last_name.push_back(name[i]);
}
};

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

然后能够这样使用:

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

这里的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. kissy延迟加载demo

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

  2. luogu P1622 释放囚犯

    题目描述 Caima王国中有一个奇怪的监狱,这个监狱一共有P个牢房,这些牢房一字排开,第i个紧挨着第i+1个(最后一个除外).现在正好牢房是满的. 上级下发了一个释放名单,要求每天释放名单上的一个人. ...

  3. jq 遍历 元素

    $("#spec").find("div.gods-spe").each(function(i,n){ var child = $(this).children ...

  4. visio使用技巧

    1.背景放大: 按住Ctrl键,滚动鼠标滚轮,即可调整背景大小,这是改变的显示比例 2.背景: 按住Ctrl+E,在背景边框处拖动图标,即可拉大或者缩小背景,这是实际更改背景大小.

  5. MySQL 高可用:mysql+mycat实现数据库分片(分库分表)

    本文引用于http://blog.csdn.net/kk185800961/article/details/51147029 MySQL 高可用:mysql+mycat实现数据库分片(分库分表) 什么 ...

  6. axios简单封装

    写在最前面 新手前端刚刚接触vue,感觉真的好用.项目中需要使用axios,然后学习了一下.借鉴网上一些大佬的经验,现在分享一下axios的简单封装,如果有什么错误的地方,请大家指出. axios安装 ...

  7. makefile编写helloworld

    相信在unix下编程的没有不知道makefile的,刚开始学习unix平台 下的东西,了解了下makefile的制作,觉得有点东西可以记录下. 下面是一个极其简单的例子: 现在我要编译一个Hello ...

  8. 【hdu 1890】Robotic Sort

    [题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=1890 [题意] 给你n个数字; i从1到n; 每次让你把第i小的数和数组的第i个元素之间这段区间内 ...

  9. Docker学习总结(11)——八个Docker的真实应用场景

    [编者的话]Flux 7介绍了常用的8个Docker的真实使用场景,分别是简化配置.代码流水线管理.提高开发效率.隔离应用.整合服务器.调试能力.多租户环境.快速部署.我们一直在谈Docker,Doc ...

  10. Zepto源代码分析之二~三个API

    因为时间关系:本次仅仅对这三个API($.camelCase.$.contains.$.each)方法进行分析 第一个方法变量转驼峰:$.camelCase('hello-world-welcome' ...