Design Pattern Adaptor 适配器设计模式
适配器设计模式是为了要使用一个旧的接口,或许这个接口非常难用,或许是和新的更新的接口不兼容,所以须要设计一个适配器类,然后就能够让新旧的接口都统一。
就是这种一个图:
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 适配器设计模式的更多相关文章
- Design Pattern Iterator 迭代器设计模式
这个设计模式感觉很easy,我们平时敲代码的时候也是常常须要调用iterator的,C++和Java都是. 所以感觉没什么特别的.就是须要模仿C++或者Java的iterator类的功能吧. 这里简单 ...
- Design Pattern Memo 备忘录设计模式
本设计模式就是简单地记录当前状态.然后利用记录的数据恢复. 比方首先我们有一个类.类须要记录当前状态进行相关的工作的: class Memo; class Human { public: string ...
- design pattern Builder 生成器设计模式
其实设计模式可以学习很有趣,你并不需要有这么难啃旱地FOG对我来说,当然,这些都是健康的骨骼啃啃. 在本文中,建造者模式设计一个搞笑的一幕.根据这一模型来学习功夫的方法,哈哈. 基类的第一,设计.那么 ...
- Design Pattern Command 命令设计模式
这种设计模式是使用不同类的包裹不同的命令,达到什么样的命令执行什么操作. 有可能进一步利用map您最喜欢的对接命令字. 正在运行的类实际上已经包含了操作的所有需求,例如: class SuperMak ...
- Design Pattern Bridge 桥设计模式
桥设计模式事实上就是一个简单的has a relationship.就是一个类拥有还有一个类,并使用还有一个类实现须要的功能. 比方遥控器和电视之间能够使用桥设计模式达到能够使用同一个遥控器控制多台电 ...
- Design Pattern ->Adaptor
Layering & Contract Philosophy With additional indirection Adaptee object just is as a member. A ...
- Flyweight Design Pattern 共享元设计模式
就是利用一个类来完毕多种任务.不用每次都创建一个新类. 个人认为这个设计模式在C++里面,好像能够就使用一个函数取代,利用重复调用这个函数完毕任务和重复利用这个类,好像几乎相同. 只是既然是一个设计模 ...
- [Design Pattern With Go]设计模式-工厂模式
这次介绍的设计模式是工厂模式,这是一个比较常见的创建型模式.一般情况下,工厂模式分为三种:简单工厂.工厂方法和抽象工厂,下面慢慢举例介绍下. 简单工厂 考虑一个加密程序的应用场景,一个加密程序可能提供 ...
- [Design Pattern With Go]设计模式-单例模式
定义 一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例模式.当某些数据只需要在系统中保留一份的时候,可以选择使用单例模式. 饿汉式 饿汉式的实现方式比较简单.在类加 ...
随机推荐
- django 分组统计遇见的问题
在使用 django 的时候发现了一个坑 例如: In [54]: print(F.objects.all().values("age").annotate(fff=Count(& ...
- webpack中optimization 的 runtimeChunk 是干嘛的
结论:把runtime部分的代码抽离出来单独打包 https://developers.google.com/web/fundamentals/performance/webpack/use-long ...
- NodeJS学习笔记 (8)网络服务-http-server(ok)
http服务端概览 创建server 几行代码搞定 var http = require('http'); var requestListener = function(req, res){ res. ...
- es-for-Laravel: Composer 包安装, Laravel 最简单的方式操作 Elasticsearch
composer 安装:composer require ethansmart/es-for-laravel github 地址:https://github.com/roancsu/es-for-l ...
- Jquery-基础知识点
jquery 包含的功能 1.HTML元素选取.操作 2.CSS操作 3.HTML事件函数 4.Javascript特效和动画 5.HTML DOM遍历和修改 6.AJAX 7. Untilities ...
- ASP.NET-ajax.BeginForm使用02
Ajax.BeginForm中OnFailure.Onsuccess.OnComplete函数是可以处理从后台返回的数据的,比直接使用jquery的$.ajax方法还要节约时间 @using( ...
- 一 Storm 基础
1 Storm 分布式计算结构称为 Topology (拓扑) Topology 由 stream(数据流).spout(数据流的生成者).bolt(运算)组成. ...
- Android 购物车的实现
实现了购物车的全选 全不选 选中删除 选中状态下数量添加时总价随之添加等基本功能. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L ...
- mysql-联结
一.联结 联结是利用SQL的select能执行的最重要的操作. 1.关系表:假如有一个包含产品目录的数据库表,其中每个类别的物品占一行.对于每种物品要求存储的信息包括产品描述和价格,以及生产该产品的供 ...
- vim-YCM插件安装
这两天开始使用vim来学习C++语言,中间少不了要进行编译.才刚刚写了两个小例子就开始发现,每次都要退出vim来进行编译,实在太麻烦了.这时候才想到之前有在一本关于vim的书籍上看到quickfix的 ...