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(适配器)-类对象结构型模式的更多相关文章

  1. 组合模式/composite模式/对象结构型模式

    组合模式/composite模式/对象结构型 意图 将对象组合成树形结构以表示"整体--部分"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 动机 C ...

  2. Facade(外观)-对象结构型模式

    1.意图 为子系统中的一组接口提供一个一致的接口,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 2.动机 将一个系统划分成若干子系统有利于降低系统的复杂性.一个常见的设计目 ...

  3. Bridge模式——对象结构型模式

    今天看了Bridge模式,对其进行简单的总结,并给出几篇通俗易懂的文章链接. (一)意图--将抽象部分和它的实现部分分离,使它们都可以独立地变化. 适用于从多维度描述的类型,拆解开来,使其能沿着各维度 ...

  4. Decorator(装饰)-对象结构型模式

    1.意图 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 2.别名 包装器 Wrapper. 3.动机 给某个对象而不是整个类添加一些功能.一个较为灵 ...

  5. Bridge(桥接)-对象结构型模式

    1.意图 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 2.动机 在抽象类与它的实现之间起到桥梁作用,使它们可以独立地变化. 3.适用性 不希望在抽象和它的实现部分之间有一个固定的绑定关系. ...

  6. Composite(组合)--对象结构型模式

    1.意图 将对象组合成树形结构以表示“部分-整体”的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 2.动机 可以组合多个简单组件以形成一些较大的组件,这些组件又可以组合成 ...

  7. Proxy(代理)-对象结构型模式

    1.意图 为其它对象提供一种代理以控制对这个对象的访问. 2.别名 Surrogate. 3.动机 通过Proxy可以达到对一个对象的访问控制. 4.适用性 远程代理  为一个对象在不同地址空间提供局 ...

  8. Flyweight(享元)--对象结构型模式

    1.意图 运用共享技术有效地支持大量细粒度的对象. 2.动机 Flyweight模式描述了如何共享对象,使得可以细粒度地使用它们,而无需高昂的代价.flyweight是一个共享对象,它可以同时在多个场 ...

  9. .NET设计模式(15):结构型模式专题总结(转)

    摘要:结构型模式,顾名思义讨论的是类和对象的结构,它采用继承机制来组合接口或实现(类结构型模式),或者通过组合一些对象,从而实现新的功能(对象结构型模式).这些结构型模式,它们在某些方面具有很大的相似 ...

随机推荐

  1. 微信接口access_token

    //调用聚合网笑话接口 $url = 'http://japi.juhe.cn/joke/img/text.from?page=&pagesize=2&key=f0d06a1fe45b ...

  2. js事件冒泡和事件捕获

    事件捕获当你使用事件捕获时,父级元素先触发,子级元素后触发,即div先触发,p后触发.事件冒泡当你使用事件冒泡时,子级元素先触发,父级元素后触发,即p先触发,div后触发.W3C模型W3C模型是将两者 ...

  3. 【ASP.net】Equals 和 == 的区别

    在比较Equals 和 ==的区别前.我们先来了解下相关的知识 C#数据类型 1.值类型 值类型有: 值类型包括:简单类型.结构类型.枚举类型:引用类型包括:Object 类型.类类型.接口.代表元. ...

  4. win7 共享问题,"您可能没有权限使用网络资源"

    原文:http://hi.baidu.com/celian521/item/81b16e7c59996e295d178946 1 打开受访者的guest权限2 开始--运行--gpedit.msc3 ...

  5. iOS中如何让TextView和TextField控件支持return键收起输入法

    TextView和TextField控件是iOS中负责接收用户输入的控件,那当用户输入完成时怎么收起面板呢? 1.TextView和TextField控件获得焦点之后的第一反应就是弹出输入法面板: 2 ...

  6. IOS开发-属性动画和关键帧动画的使用

    CAMediaTiming是一个协议(protocol),CAAnimation是所有动画类的父类,但是它不能直接使用,应该使用它的子类. 继承关系: CoreAnmiation 核心动画 简写CA ...

  7. zookeeper 笔记

    http://www.biaodianfu.com/zookeeper.html ======= ---- zookeeper这种数据结构有如下这些特点: 1,每个子目录如NameService都被作 ...

  8. 51nod 最近刷题 简要题解

    51nod 1564 由于数据是随机的,可以证明,对于每一个数,向左或右找比它小的数,长度是logn级别的 考虑枚举最大值 注意,对于每一个最大值,如果直接用2个循环枚举左右端点的话,理论是lognl ...

  9. eclipse 代码自动提示

    从Window -> preferences -> Java -> Editor -> Content assist -> Auto-Activation下,我们可以在& ...

  10. Mono addin 学习笔记 5 TypeExtensionPoint

    1. Attribute声明方式 定义扩展点: [TypeExtensionPoint]public interface ICommand{        void Run();} 定义扩展: [Ex ...