Adapter(适配器)-类对象结构型模式
1.意图
将一个类接口转换成客户希望的另外一个接口。Adapter模式使那些原本不能一起工作的类,可以一起工作。
2.别名
包装器 Wrapper.
3.动机
一个应用可能会有一些类具有不同的接口,并且这些接口互不兼容,可以专门定义一个类,用来适配互不兼容的类。
4.适用性
- 你想使用一个已经存在的类,而它的接口不符合你的需求。
- 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作。
- 你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
5.结构

6.代码实例
1.对象适配器
class Adaptee
{
public:
void SpecificRequest();
};
class Target
{
public:
virtual void Request()=;
virtual void Initilaize()=;
};
#include "Target.h"
#include <memory>
class Adaptee; class Adapter : public Target
{
public:
void Request();
void Initilaize();
std::shared_ptr<Adaptee> m_pAdaptee;
};
#include <iostream>
#include "Adaptee.h" void Adaptee::SpecificRequest()
{
std::cout << "SpecificRequest" << std::endl;
}
#include "Adaptee.h"
#include "Adapter.h" void Adapter::Request()
{
m_pAdaptee->SpecificRequest();
} void Adapter::Initilaize()
{
m_pAdaptee = std::shared_ptr<Adaptee>(new Adaptee);
}
#include "Adapter.h" int main()
{
std::shared_ptr<Adapter> pAdapter(new Adapter);
std::shared_ptr<Target> pTarget = std::dynamic_pointer_cast<Target>(pAdapter);
pTarget->Initilaize();
pTarget->Request(); while();
}
测试结果:

2.类适配器
#include "Target.h"
#include "Adaptee.h" class AdapterClass : public Target,private Adaptee
{
public :
void Request();
void Initilaize();
};
以上代码为类适配器,公有继承Target,私有继承Adaptee,即只继承Adaptee的实现,不继承其接口。
#include "AdapterClass.h" void AdapterClass:: Request()
{
SpecificRequest();
}
void AdapterClass::Initilaize()
{
}
以上为类适配器的实现,在Request中调用Adaptee的SpecifiRequest。
#include "Adapter.h" int main()
{
std::shared_ptr<Adapter> pAdapter(new Adapter);
//std::shared_ptr<Target> pTarget = std::dynamic_pointer_cast<Target>(pAdapter);
//pTarget->Initilaize();
pAdapter->Request(); while();
}
测试代码,直接调用Adapter的Request从而能够达到目的。
7.效果
类适配器:
- 用一个具体的Adapter类对Adaptee和Target进行匹配。结果是当我们想要匹配一个类以及所有它的子类时,类Adapter将不能工作。
- 使得Adapter可以重定义Adaptee的部分行为,因为Adapter是Adaptee的一个子类。
- 仅仅引入了一个对象,并不需要额外的指针以间接得到Adaptee.
对象适配器:
- 允许一个Adapter同时与多个Adaptee同时工作。
- 使得重定义Adaptee的行为比较困难。
Adapter(适配器)-类对象结构型模式的更多相关文章
- 组合模式/composite模式/对象结构型模式
组合模式/composite模式/对象结构型 意图 将对象组合成树形结构以表示"整体--部分"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 动机 C ...
- Facade(外观)-对象结构型模式
1.意图 为子系统中的一组接口提供一个一致的接口,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 2.动机 将一个系统划分成若干子系统有利于降低系统的复杂性.一个常见的设计目 ...
- Bridge模式——对象结构型模式
今天看了Bridge模式,对其进行简单的总结,并给出几篇通俗易懂的文章链接. (一)意图--将抽象部分和它的实现部分分离,使它们都可以独立地变化. 适用于从多维度描述的类型,拆解开来,使其能沿着各维度 ...
- Decorator(装饰)-对象结构型模式
1.意图 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 2.别名 包装器 Wrapper. 3.动机 给某个对象而不是整个类添加一些功能.一个较为灵 ...
- Bridge(桥接)-对象结构型模式
1.意图 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 2.动机 在抽象类与它的实现之间起到桥梁作用,使它们可以独立地变化. 3.适用性 不希望在抽象和它的实现部分之间有一个固定的绑定关系. ...
- Composite(组合)--对象结构型模式
1.意图 将对象组合成树形结构以表示“部分-整体”的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 2.动机 可以组合多个简单组件以形成一些较大的组件,这些组件又可以组合成 ...
- Proxy(代理)-对象结构型模式
1.意图 为其它对象提供一种代理以控制对这个对象的访问. 2.别名 Surrogate. 3.动机 通过Proxy可以达到对一个对象的访问控制. 4.适用性 远程代理 为一个对象在不同地址空间提供局 ...
- Flyweight(享元)--对象结构型模式
1.意图 运用共享技术有效地支持大量细粒度的对象. 2.动机 Flyweight模式描述了如何共享对象,使得可以细粒度地使用它们,而无需高昂的代价.flyweight是一个共享对象,它可以同时在多个场 ...
- .NET设计模式(15):结构型模式专题总结(转)
摘要:结构型模式,顾名思义讨论的是类和对象的结构,它采用继承机制来组合接口或实现(类结构型模式),或者通过组合一些对象,从而实现新的功能(对象结构型模式).这些结构型模式,它们在某些方面具有很大的相似 ...
随机推荐
- MFC各种控件的常见操作(逐步添加中......)
由于经常切换系统或界面框架进行编程,难免有时会忘记之前的编程函数等等.所有在此自己做一个备份,以防止重新充电带来的痛苦! 1.CButton 1.1 在VC中编程实现按钮的启用(enable)和禁用( ...
- 关于 MAXScript 拷贝文件夹及内容到其他位置
之前用 hiddenDOSCommand 本机测试通过,但是换其他电脑有时会不能用... fn xcopy oldfile newfile = ( newfilepath = newfile + &q ...
- MongoDB学习笔记二:创建、更新及删除文档
插入并保存文档 对目标集使用insert方法插入一个文档: > db.foo.insert({"bar" : "baz"}) 这个操作会给文档增加一个&q ...
- Ubuntu 系统密码相关问题
第一个问题: Ubuntu 密码失效解决办法 拷贝:http://www.myexception.cn/operating-system/1707766.html ubuntu14.04突然不能登录, ...
- Python字典实现三级菜单
################################################ # Task Name: 三级菜单 # # Description:打印省.市.县三级菜单 # # 可 ...
- IntelliJ IDEA热加载自动更新(Update classes and resources )
IntelliJ IDEA默认文件是自动保存的,但是手头有个项目jsp文件改动后,在tomcat中不能立即响应变化.想要jsp文件改动后立刻看到变化,可以通过修改配置来实现. ...
- [转]C#创建Windows服务与安装
本文档用于创建windows服务说明,使用vs2010系统平台 创建项目 1 创建windows服务项目 2 右键点击Service1.cs,查看代码, 用于编写操作逻辑代码 3 代码中OnStart ...
- IOS中图片拉伸技巧与方法总结(转载)
以下内容转载自:http://my.oschina.net/u/2340880/blog/403996 IOS中图片拉伸技巧与方法总结 一.了解几个图像拉伸的函数和方法 1.直接拉伸法 简单暴力,却是 ...
- razor 拼接字符串
在asp.net引擎中 拼接字符串可以这样写 <script src="~/script/<%=scriptname%>.js"></script&g ...
- typedef struct 结构体
typedef struct _TTTT_ { int i; }TT_TT; 定义变量如下: struct _TTTT_ NewTT;方法1 TT_TT NewTT;方法2 是声明和定义 ...