来源:爱编程的大丙
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;
}