案例:打篮球请外援需要翻译
适配器模式
适配器模式定义(AdapterPattern)
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
适配器模式结构
- 适配器类(Adapter): 适配器与适配者之间是继承或实现关系
- 适配者类(Adaptee): 适配器与适配者之间是关联关系
- 目标抽象类(Target): 定义客户所需要的接口
适配器模式代码示例
https://gitee.com/NiMiKiss/design-pattern.git
#ifndef _ADAPTER_PATTERN_
#define _ADAPTER_PATTERN_
#include<iostream>
class Player
{
public:
Player(const std::string& sName) :m_sName(sName) {}
std::string GetName() { return m_sName; }
virtual void NationalityAttack() = 0;
virtual void NationalityDefense() = 0;
private:
std::string m_sName;
};
class NationalityPlayer :Player
{
public:
NationalityPlayer(const std::string& sName) :Player(sName) {}
void NationalityAttack()
{
std::cout << GetName() << " 攻击" << std::endl;
}
void NationalityDefense()
{
std::cout << GetName() << " 防守" << std::endl;
}
};
class ForeignPlayer
{
public:
ForeignPlayer(const std::string& sName) :m_sName(sName) {}
std::string GetName() { return m_sName; }
void ForeignAttack()
{
std::cout << m_sName << " Attack" << std::endl;
}
void ForeignDefense()
{
std::cout << m_sName << " Defense" << std::endl;
}
private:
std::string m_sName;
};
class Translator :public Player
{
public:
Translator(std::shared_ptr<ForeignPlayer> spForeignPlayer)
:m_spForeignPlayer(spForeignPlayer), Player(spForeignPlayer->GetName()) {}
void NationalityAttack()
{
m_spForeignPlayer->ForeignAttack();
}
void NationalityDefense()
{
m_spForeignPlayer->ForeignDefense();
}
private:
std::shared_ptr<ForeignPlayer> m_spForeignPlayer;
};
#endif // !_ADAPTER_PATTERN_
客户端调用
#include "Adapter_Pattern.h"
#include<iostream>
int main()
{
auto spForeignPlayer = std::shared_ptr<ForeignPlayer>(new ForeignPlayer("Tom"));
auto spTranslator = std::shared_ptr<Translator>(new Translator(spForeignPlayer));
auto spNationalityPlayer = std::shared_ptr<NationalityPlayer>(new NationalityPlayer("小明"));
spTranslator->NationalityDefense();
spNationalityPlayer->NationalityAttack();
spTranslator->NationalityAttack();
spNationalityPlayer->NationalityDefense();
return EXIT_SUCCESS;
}