适配器模式
1. 适配器模式:对象适配器
将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
简单来说,就是需要的东西就在面前,但却不能使用,短时间内又无法改造它,于是我们就想办法适配它。
翻译就是一种适配器。可以让不会英语的人听懂说英语人的意思。
2. 适配器模式:
主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。
何时使用?
在想使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,就该考虑使用适配器模式。
两个类所做的事情相同或相似,但是具有不同的接口时要使用。
通常是在软件开发后期或维护期考虑使用。
开发起始阶段,如果公司设计系统时考虑使用第三方开发组件,而这个组件的接口与我们自己的系统接口不相同时,我们也完全没有必要为了迎合它而改动自己的接口,此时尽管是在开发的设计阶段,也可以考虑用适配器模式来解决接口不同的问题。
3. 适配器模式的例子:
#include <iostream>
#include <string>
using namespace std;
class Adaptee//需要适配的类
{
public:
virtual void myRequest()
{
cout<<"实际上的接口"<<endl;
}
};
class Target//客户期待的接口
{
public:
virtual void request()=0;
~virtual Target(){}
};
class Adapter:public Target//在内部包装一个Adaptee对象,把源接口转换成目标接口
{
private:
Adaptee adaptee;
public:
void request()
{
adaptee.myRequest();
}
};
int main()
{
Target *target=new Adapter();
target->request();
delete target;
return 0;
}
//篮球翻译适配器
class Player
{
public:
string name;
Player(string name)
{
this->name=name;
}
virtual void attack()=0;
virtual void defence()=0;
};
class Forwards:public Player
{
public:
Forwards(string name):Player(name){}
void attack()
{
cout<<name<<" 前锋进攻"<<endl;
}
void defence()
{
cout<<name<<" 前锋防守"<<endl;
}
};
class Center:public Player
{
public:
Center(string name):Player(name){}
void attack()
{
cout<<name<<" 中锋进攻"<<endl;
}
void defence()
{
cout<<name<<" 中锋防守"<<endl;
}
};
class Backwards:public Player
{
public:
Backwards(string name):Player(name){}
void attack()
{
cout<<name<<" 后卫进攻"<<endl;
}
void defence()
{
cout<<name<<" 后卫防守"<<endl;
}
};
/*****************************************************************/
class ForeignCenter
{
public:
string name;
ForeignCenter(string name)
{
this->name=name;
}
void myAttack()
{
cout<<name<<" 外籍中锋进攻"<<endl;
}
void myDefence()
{
cout<<name<<" 外籍后卫防守"<<endl;
}
};
/*****************************************************************/
class Translator:public Player
{
private:
ForeignCenter *fc;
public:
Translator(string name):Player(name)
{
fc=new ForeignCenter(name);
}
void attack()
{
fc->myAttack();
}
void defence()
{
fc->myDefence();
}
};
/*****************************************************************/
int main()
{
Player *p1=new Center("李俊宏");
p1->attack();
p1->defence();
Translator *tl=new Translator("姚明");
tl->attack();
tl->defence();
return 0;
}