大话设计模式(7)——适配器模式(Adapter Pattern)

适配器模式(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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值