大话设计模式中的适配器模式(adapter)c++版本
/*
* adapter.cpp
*
* Created on: Sep 28, 2017
* Author: clh01s@163.com
* 适配器模式将一个类的接口转换成客户希望的另外一个接口
*/
#include <iostream>
#include <string>
using namespace std;
//基类
class Player
{
public:
Player(string name){_name = name;}
virtual ~Player(){};
virtual void Attack() = 0;
virtual void Definse() = 0;
protected:
string _name;
};
//继承基类实现其虚函数
class Forwards:public Player
{
public:
Forwards(string name):Player(name)
{
}
void Attack() override
{
cout<<_name<<"前锋进攻"<<endl;
}
void Definse() override
{
cout<<_name<<"前锋防守"<<endl;
}
};
//继承基类实现其虚函数
class Center:public Player
{
public:
Center(string name):Player(name)
{
}
void Attack() override
{
cout<<_name<<"中锋进攻"<<endl;
}
void Definse() override
{
cout<<_name<<"中锋防守"<<endl;
}
};
//继承基类实现其虚函数
class Guards:public Player
{
public:
Guards(string name):Player(name)
{
}
void Attack() override
{
cout<<_name<<"后卫进攻"<<endl;
}
void Definse() override
{
cout<<_name<<"后卫防守"<<endl;
}
};
//外籍中锋模拟接口不同的类
class ForeignCenter
{
public:
string get_name(){return _name;}
void set_name(string name){_name = name;}
void Attack(){cout<<_name<<"外籍中锋进攻"<<endl;}
void Definse(){cout<<_name<<"外籍中锋防守"<<endl;}
private:
string _name;
};
//适配器类继承基类,通过在内部声明一个外籍中锋的实例来操作外籍中锋的动作(模拟翻译的效果)
class Translator:public Player
{
public:
Translator(string name):Player(name)
{
wjzf->set_name(name);
}
void Attack() override
{
wjzf->Attack();
}
void Definse() override
{
wjzf->Definse();
}
private:
//外籍中锋实例
ForeignCenter *wjzf = new ForeignCenter();
};
int main()
{
Player* b = new Forwards("巴蒂尔");
b->Attack();
Player* m = new Guards("麦克格雷迪");
m->Definse();
//声明适配器类通过适配器类调用外籍球员的操作
Player* ym = new Translator("姚明");
ym->Attack();
ym->Definse();
return 0;
}
运行结果
clh@clh:~/testcode/设计模式$ ./a.out
巴蒂尔前锋进攻
麦克格雷迪后卫防守
姚明外籍中锋进攻
姚明外籍中锋防守
适配器模式的使用情景(摘抄于《设计模式》):
1.你想使用一个已经存在的类,而它的接口不符合你的需求。
2.你想创建一个可以复用的类,该雷可以与其它不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作
3.(仅适用于对象Adapter)你想使用一个已经存在的类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
转载请注明源地址:http://blog.csdn.net/clh01s