大家知道,输电线用的是高压电,家庭照明使用的220V低压电,那怎么办呢,大家都知道了,使用变压器,其实也可叫适配器。
适配器模式,将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于不兼容而不能一起工作的那些类可以一起工作。
适配器模式,将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于不兼容而不能一起工作的那些类可以一起工作。
适配器模式主要解决的问题:东西在你面前,却不同使用,短时间又无法改造他,于是就需要想办法适配它。在软件开发中,也就是系统的数据和行为都正确,但接口不符合,我们应该考虑到用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用某些现存的类,但是就扣又与复用环境要求不一致的情况。适配器模式主要有两类,类型适配器模式和对象适配器模式。
#include<iostream>
#include<string>
using namespace std;
class Player//我们的目标类,所有的运动员的抽象基类
{
protected:
string name;
public:
Player(string _name) :name(_name)
{}
virtual void Attack() = 0;
virtual void Defence() = 0;
virtual ~Player()
{}
};
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 ForeignCenter//一个外籍的运动员,没有继承Player,因此无法使用Player的接口,但是他也有player的所有能力,需要适配
{
private:
string name;
public:
ForeignCenter(string _name) :name(_name)
{}
void Attack()
{
cout << "外籍中锋" << name << "进攻" << endl;
}
void Defence()
{
cout << "外籍中锋" << name << "防守" << endl;
}
};
class Translator :public Player//这是一个适配器,让外籍运动员和本地看起来没什么两样,自然需要继承player
{
private:
ForeignCenter *f;//需要适配的对象
public:
Translator(string name) :Player(name)
{
f = new ForeignCenter(name);
}
void Attack()
{
f->Attack();//
}
void Defence()
{
f->Defence();
}
~Translator()
{
delete f;
}
};
int main()
{
Player *p1 = new Center("乔丹");//不需要适配的运动员
p1->Attack();
p1->Defence();
Player *pt = new Translator("姚明");//适配,然后就是Player了,大家都一样了
pt->Attack();//
pt->Defence();
delete p1;
delete pt;
}
我们以篮球运动员为例,无论是前锋还是后卫,还是中锋,都是运动员,这个就是客户所期待的接口,也就是Adapter,现在来了一个外籍中锋Adaptee,但是他不懂本国语言,但是他必须得有运动员所需要的全部技能(也就是必须能够实现Target中的所有动作),现在来了一个翻译Adapter来给外籍的翻译。
适配器模式有哪些使用场景呢?在软件开发中,有的时候我们要使用老系统的一些东西怎么办呢?重新开发太麻烦了,那么就可以使用适配器模式,使其适配新的接口。