设计模式:Adapter(适配器)模式



Adapter模式,适配器模式


模式描述:

有时候我们需要改变接口,那么接口改变后如何让原有的方法适配新的接口?这是我们经常需要考虑的。Adapter模式将一个类的接口转换成我们希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。


Adapter模式的关键特征:

意图:使控制范围之外的一个原有对象与某个接口匹配。

问题:系统的数据和行为都正确,但接口不符合,通常用于必须从抽象类派生时。

解决方案:Adapter模式提供了具有所需接口的包装类。Adapter改变了Adaptee的接口,使得Adaptee与Adapter的基类Target匹配。这样Client就可以使用Adaptee。好像它是Target类型。

实现:将原有类包含在另一类中,让包含类与需要的接口匹配,调用被包含类的方法。


Adapter的两种方式:

1.类的适配器模式(采用继承实现)

2.对象适配器(采用对象组合方式实现)


类的适配器模式:

Adapter与Adaptee是继承关系
1、用一个具体的Adapter类和Target进行匹配。结果是当我们想要一个匹配一个类以及所有它的子类时,类Adapter将不能胜任工作
2、使得Adapter可以重定义Adaptee的部分行为,因为Adapter是Adaptee的一个子集
3、仅仅引入一个对象,并不需要额外的指针以间接取得adaptee
2)对象适配器模式—— 适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。

对象适配模式:
Adapter与Adaptee是委托关系
1、允许一个Adapter与多个Adaptee同时工作。Adapter也可以一次给所有的Adaptee添加功能
2、使用重定义Adaptee的行为比较困难
无论哪种适配器,它的宗旨都是:保留现有类所提供的服务,向客户提供接口,以满足客户的期望。
即在不改变原有系统的基础上,提供新的接口服务。


类模式适配图:




对象模式适配图:



代码实现:

Adapter.h

#ifndef _MYADAPTER_H_
#define _MYADAPTER_H_
class Target
{
public:
	Target();
	virtual ~Target();
	virtual void Request(); //声明的接口

};
class Adaptee
{
public:
	Adaptee();
	~Adaptee();
	void SpecificRequest();  //需要被适配
};

//类模式适配,一般采用多继承。通过private继承获得实现继承的结果。
class Adapter:public Target,private Adaptee
{
public:
	Adapter();
	~Adapter();
	virtual void Request(); //实现Target定义的接口
};

//对象组合方式实现:
class Adapter1:public Target
{
public:
	Adapter1(Adaptee* adaptee);
	Adapter1();
	~Adapter1();
	virtual void Request();
private:
	Adaptee* m_adaptee;
};
#endif



Adapter.cpp

#include "MyAdapter.h"
#include <iostream>
using namespace std;
Target::Target()
{
}
Target::~Target()
{
}
void Target::Request()
{
	cout << "Target::Requset" << endl;
}
Adaptee::Adaptee()
{
}
Adaptee::~Adaptee()
{
}
void Adaptee::SpecificRequest()
{
	cout << "Adaptee::SpecificRequset" << endl;
}

//类模式实现:
Adapter::Adapter()
{
}
Adapter::~Adapter()
{
}

void Adapter::Request()
{
	cout << "Adapter::Request" << endl;
	SpecificRequest();
}

//对象组合模式实现:
Adapter1::Adapter1() :m_adaptee(new Adaptee)
{
}

Adapter1::Adapter1(Adaptee* adaptee) : m_adaptee(adaptee)
{
}

Adapter1::~Adapter1()
{
}

void Adapter1::Request()
{
	cout << "Adapter1::Requset" << endl;
	m_adaptee->SpecificRequest();
}



Main.cpp

#include "MyAdapter.h"
#include <iostream>
using namespace  std;
int main()
{
	//类模式:
	Target* pTarget = new Adapter();
	pTarget->Request();

	cout << endl;
	//对象组合模式:
	Target* pTarget2 = new Adapter1();
	pTarget2->Request();

	return 0;
}


总结:

Facade模式与Adapter模式的对比:

1.Facade模式中,无需要按照某个接口进行设计,而在Adapter模式中,必须按照原价存在的某个特定接口进行设计。

2.Facade模式中不需要多态行为,而在Adapter模式中多态行为可能是需要的。

3.Facade模式中的动机是简化接口,而在Adapter模式中,尽管也是越简单越好,但是设计必须遵循一个已经存在的接口,不能简化任何东西,即使可能存在跟尾简单的接口。

Facade模式简化了接口,而Adapter模式则将一个已经存在的接口转换为另一个接口。Adapter模式是一个常用的模式,它讲一个或者多个类的接口转换成我们需要类所具备的另一个接口,它的实现方式:创建一个类所需接口的新类,然后包装原有类的方法,这样实际上就包含了原有的对象。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值