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

发布时间:2023年12月18日
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 <iostream>
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;
}

运行结果:

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

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

文章来源:https://blog.csdn.net/myepicure/article/details/134883279
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。