适配器模式(Adapter Pattern)
适配器模式(Adapter):将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类(Adaptee)可以一起工作。
实例1
#include <iostream>
using namespace std;
//自带充电器 相当于Adaptee
class OwnCharger {
public:
void ChargeWithFeetFlat() {
cout << "正在使用自带充电器充电" << endl;
}
};
//德国提供的插座 相当于Target
class IGermanySocket {
public:
virtual void Charge() = 0;
};
//电源适配器 相当于Adapter
class PowerAdapter :public IGermanySocket {
public:
PowerAdapter(): m_pCharger(new OwnCharger){}
~PowerAdapter(){
if (m_pCharger != NULL) {
delete m_pCharger;
m_pCharger = NULL;
}
}
void Charge() {
m_pCharger->ChargeWithFeetFlat();
}
private:
OwnCharger* m_pCharger;
};
int main() {
//创建适配器
IGermanySocket* pAdapter = new PowerAdapter;
//充电
pAdapter->Charge();
return 0;
}
实例2
#include <iostream>
using namespace std;
//相当于Target
class Player {
public:
Player(){}
virtual void Attack() = 0;
virtual void Defense() = 0;
protected:
string name;
};
class Forword :public Player {
public:
Forword(string name) { this->name = name; }
virtual void Attack() {
cout << "前锋" << this->name << "进攻" << endl;
}
virtual void Defense() {
cout << "前锋" << this->name << "防守" << endl;
}
};
class Guards :public Player {
public:
Guards(string name) { this->name = name; }
virtual void Attack() {
cout << "后卫" << this->name << "进攻" << endl;
}
virtual void Defense() {
cout << "后卫" << this->name << "防守" << endl;
}
};
//相当于Adaptee
class ForeignCenter {
public:
void ForeignAttack() {
cout << "外籍中锋" << this->name << "进攻" << endl;
}
void ForeignDefence() {
cout << "外籍中锋" << this->name << "防守" << endl;
}
void SetName(string name) {
this->name = name;
}
private:
string name;
};
//相当于Adapter
class Translator :public Player {
public:
//Translator(string name) { this->name = name; } //注意不能这么写
Translator(string name) {
m_fCenter->SetName(name);
}
virtual void Attack() {
m_fCenter->ForeignAttack();
}
virtual void Defense() {
m_fCenter->ForeignDefence();
}
private:
ForeignCenter* m_fCenter = new ForeignCenter();
};
int main() {
Player* a = new Forword("forword");
a->Attack();
Player* b = new Guards("guard");
b->Attack();
Player* cc = new Translator("foreigncenter");
cc->Attack();
cc->Defense();
return 0;
}