设计模式(3)--对象结构(1)--适配器

1. 意图

    将一个类的接口转换成客户希望的另外一个接口。

    适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

2. 三种角色

    目标(Target)、被适配者(Adaptee)、适配器(Adapter)

3. 优点

    3.1 类适配器

      a. Adapter可以重定义Adaptee的部分行为,因为Adapter是它的一个子类。

      b. 仅仅引入了一个对象,不需要额外的指针得到Adaptee。

    3.2 对象适配器 

      a. 允许一个Adapter与多个Adaptee(其本身及它的所有子类)。

4. 缺点

    4.1 类适配器

       a. 一个Adapter只能对应一个Adaptee(不能适配其子类)。

    4.2 对象适配器 

       a. Adapter需要额外的指针得到Adaptee。

       b. 重定义Adaptee的行为比较困难,需要生成Adaptee子类使得Adapter引用这个子类。

5. 相关模式

    5.1 Adapter是改变一个已有对象的接口,而Bridge是将接口和实现分离。

    5.2 Decorator是增强其他对象的功能,但不改变它的接口,且支持递归组合。而Adapter不行。

    5.3 Proxy在不改变它的接口的条件下,为另一个对象定义了一个代理。

6. 代码示意(C++)
#pragma once
#include 
using namespace std;

class Target
{
public:
	virtual void Request()
	{
		cout << "Target普通的请求" << endl;
	}
};

class Adaptee
{
public:
	virtual void SpecificalRequest()
	{
		cout << "Adaptee特殊请求" << endl;
	}
};

class ClassAdapter : public Target, public Adaptee
{
public:
	virtual void Request()
	{
		SpecificalRequest();
		Target::Request();
	}
};

class ObjectAdapter : public  Target
{
private:
	Adaptee* m_pAdaptee;
public:
	virtual void Request()
	{
		m_pAdaptee->SpecificalRequest();
		Target::Request();
	}
	ObjectAdapter()
	{
		m_pAdaptee = new Adaptee();
	}
	~ObjectAdapter()
	{
		delete m_pAdaptee;
	}
};
#include "Target.h"
int main() {

	ClassAdapter* pClassAdapter = new ClassAdapter;
	pClassAdapter->Request();

	ObjectAdapter* pObjectAdapter = new ObjectAdapter;
	pObjectAdapter->Request();

	delete pClassAdapter;
	delete pObjectAdapter;

	return 0;
}

运行结果:

设计模式(3)--对象结构(1)--适配器_第1张图片

6.1 类适配器ClassAdapter可以重新实现SpecificalRequest(3.1.a)

6.2 对象适配器ObjectAdapter不需要修改代码,就可以对Adaptee的子类同样适配(3.2.a)

你可能感兴趣的:(设计模式,设计模式)