适配器模式

来源:互联网 发布:芭碧琪面膜怎么样 知乎 编辑:程序博客网 时间:2024/06/07 17:36
大家知道,输电线用的是高压电,家庭照明使用的220V低压电,那怎么办呢,大家都知道了,使用变压器,其实也可叫适配器。
适配器模式,将一个类的接口转换成客户希望的另外一个接口。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来给外籍的翻译。    适配器模式有哪些使用场景呢?在软件开发中,有的时候我们要使用老系统的一些东西怎么办呢?重新开发太麻烦了,那么就可以使用适配器模式,使其适配新的接口。

原创粉丝点击