C++设计模式——适配器模式(adapter pattern)

一、原理讲解

适配器模式别名为包装器(wrapper),分为类适配器(通过多继承实现)、对象适配器(组合方式实现),由于类适配器比较少用,本文主要讲解用的比较多的对象适配器。

1.1意图

将一个类的接口转换成客户希望的另一个接口。Adapter使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

1.2应用场景

  • 你想使用一个已经存在的类,而它的接口不符合你的需求;
  • 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作;
  • (适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口;

1.3结构图(UML图)

C++设计模式——适配器模式(adapter pattern)_第1张图片

1.4代码实现步骤

a1 定义一个目标接口类ITarget,定义一个接口函数request();
a2 定义一个被适配类Adaptee,被适配的具体函数realRequest();
a3 定义一个适配器类Adapter,实现统一接口函数request(),在里面调用和转换被适配类的具体接口函数Adaptee::realRequest()为一个统一接口;

二、实现代码

AdapterPattern.cpp

#include 

using namespace std;

#define DELETE(pointer) delete pointer; pointer=nullptr

class Adaptee // 被适配类
{
public:
	void realRequest() { cout << "Adaptee::realRequest();" << endl; } //被适配接口
};

class ITarget
{
public:
	virtual ~ITarget() {}
	virtual void request() = 0; //目标接口
};

class Adapter : public ITarget
{	
	Adaptee *adaptee; // 被适配对象
public:
	Adapter() :adaptee(new Adaptee()) {}
	~Adapter() { if (adaptee) DELETE(adaptee); }
	virtual void request() override { adaptee->realRequest(); }	// 适配器统一接口函数
};

void doAdapter() // 客户端client
{
	ITarget *target = new Adapter();
	target->request();
	DELETE(target);
}

mian.cpp

#include 

extern void doAdapter();

int main()
{
	doAdapter();

	system("pause");
	return 1;
}

C++设计模式——适配器模式(adapter pattern)_第2张图片

三、总结

通过以上代码可以看出,适配器模式将不统一的接口转换为统一的接口进行调用,也就是相当于对被调用的所有接口进行一层统一的封装,达到高内聚效果。上述类Adapter继承类Target主要目的有两个,其一是继承接口request(),其二是调用的时候用抽象类,符合依赖倒置原则。一般我们调用不同平台或者厂商的库函数时可以考虑用适配器模式。
总的来说,适配器模式就是对被调用的接口进行了一层类接口的封装。

四、参考内容

设计模式之适配器模式(C++)
适配器模式及C++实现
最常用的设计模式—适配器模式(C++实现)
陈建忠设计模式(参考:哔哩哔哩C++设计模式!!!)
Erich Gamma,Richard Helm.《设计模式 可复用面向对象软件的基础》[M].机械工业出版社,2019:

你可能感兴趣的:(设计模式,设计模式,c++,适配器,adapter,vs2017)