【设计模式】适配器

发布于:2024-05-23 ⋅ 阅读:(151) ⋅ 点赞:(0)

来源:爱编程的大丙

STL标准模板库有六大组件,其中之一就是适配器

六大组件分别是:容器、算法、迭代器、仿函数、空间适配器

适配器可以分为:容器适配器、函数适配器、迭代器适配器

适配器,相当于沟通的桥梁。将一个类的接口转换成用户希望的另一个接口,是不兼容的对象能够互相配合在一起工作,这种模式叫做适配器模式

外国人分为美国人和法国人,他们讲不同的语言,继承一个Foreigner父类,父类有confession()方法返回一个字符串,一个setResult()接受熊猫的回复,子类美国人和法国人需重写confession()方法。

Panda类接收和发送回复。

翻译类。两种语言,子类英语翻译器和法语翻译器继承父类翻译,继承父类构造函数,重写translateToPanda()和translateToHuman()方法,translateToPanda()接收m_foreigner->confession()忏悔并输出, translateToHuman()接收m_panda.sendMessage()回复并输出

#include<iostream>
#include<string>
using namespace std;

class Foreigner {
public:
	virtual string confession() = 0;
	void setResult(string msg) {
		cout << "Panda Say: " << msg << endl;
	}
	virtual ~Foreigner() {}
};

//美国人
class American :public Foreigner {
public:
	string confession() override {
		return string("我是畜生, 我有罪!!!");
	}
};
//法国人
class French :public Foreigner {
public:
	string confession() override {
		return string("我是强盗, 我该死!!!");
	}
};

//大熊猫
class Panda {
public:
	void recvMessage(string msg) {
		cout << msg << endl;
	}
	string sendMessage() {
		return string("强盗、凶手、罪人是不可能被宽恕和原谅的!");
	}
};

//抽象乔巴翻译适配器类
class AbstractChopper {
public:
	AbstractChopper(Foreigner* foreigner):m_foreigner(foreigner) {}
	virtual void translateToPanda() = 0;
	virtual void translateToHuman() = 0;
	virtual ~AbstractChopper() {}
protected:
	Panda m_panda;
	Foreigner* m_foreigner=nullptr;
};

//英语乔巴
class EnglishChopper :AbstractChopper {
public:
	using AbstractChopper::AbstractChopper;//继承构造函数
	void translateToPanda() override {
		string msg = m_foreigner->confession();
		m_panda.recvMessage("美国人说:" + msg);
	}
	void translateToHuman() override {
		string msg = m_panda.sendMessage();
		m_foreigner->setResult("美国佬," + msg);
	}
};

//英语乔巴
class FrechhChopper :AbstractChopper {
public:
	using AbstractChopper::AbstractChopper;
	void translateToPanda() override {
		string msg = m_foreigner->confession();
		m_panda.recvMessage("法国人说:" + msg);
	}
	void translateToHuman() override {
		string msg = m_panda.sendMessage();
		m_foreigner->setResult("法国佬," + msg);
	}
};
int main() {
	Foreigner* human = new American;
	EnglishChopper* american = new EnglishChopper(human);
	american->translateToPanda();
	american->translateToHuman();
	delete human;
	delete american;
	return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到