设计模式学习(十六)————适配器模式

来源:互联网 发布:cms摄像头监控软件设置 编辑:程序博客网 时间:2024/06/05 08:40

适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

注意:如果能事先将软件的接口设计为相同,就尽量不用适配器模式,只有确实需要转换接口时才使用!

下面通过打篮球时候需要翻译来举例子:

#ifndef BASKETBALLPLAYER#define BASKETBALLPLAYER#include <QtDebug>#include <QString>class Player{public:    explicit Player(QString name):_name(name){}    virtual void Attack() = 0;    virtual void Defense() = 0;    virtual ~Player() = default;protected:    QString _name;};class Forwards final:public Player{public:    explicit Forwards(QString name):Player(name){}    void Attack() override    {        qDebug()<<"前锋"<<_name<<"攻击!";    }    void Defense() override    {        qDebug()<<"前锋"<<_name<<"防守!";    }};class Center final:public Player{public:    explicit Center(QString name):Player(name){}    void Attack() override    {        qDebug()<<"中锋"<<_name<<"攻击!";    }    void Defense() override    {        qDebug()<<"中锋"<<_name<<"防守!";    }};class Guards final:public Player{public:    explicit Guards(QString name):Player(name){}    void Attack() override    {        qDebug()<<"后卫"<<_name<<"攻击!";    }    void Defense() override    {        qDebug()<<"后卫"<<_name<<"防守!";    }};class ForeignCenter{public:    ForeignCenter() = default;    void TranslateAttack()    {        qDebug()<<"翻译后:中锋"<<_name<<"攻击!";    }    void TranslateDefense()    {        qDebug()<<"翻译后:中锋"<<_name<<"防守!";    }    void setName(QString name){_name = name;}    QString getName(){return _name;}private:    QString _name;};class Translator final:public Player   //相当于适配器{public:    explicit Translator(QString name):Player(name){_fc = QSharedPointer<ForeignCenter>(new ForeignCenter());_fc->setName(name);}    void Attack() override    {        _fc->TranslateAttack();    }    void Defense() override    {        _fc->TranslateDefense();    }private:    QSharedPointer<ForeignCenter> _fc;};#endif // BASKETBALLPLAYER#include "basketballplayer.h"int main(int argc, char *argv){    Player *ch = new Translator("姚明");    ch->Attack();    ch->Defense();    return 0;}

根据代码可以发现,适配器模式实际上就是在需要的类中保存另一个类的实例,通过调用所需要的接口的函数来从另一个类的实例中找到相关的方法来实现这个接口,完成了不同接口之间的适配。一般在两种不同的接口需要相互调用的时候来构造适配器方便他们之间的相互访问。

最后放上源码地址:https://github.com/Dongzhixiao/designMode_qt/tree/master/translate_adapter_pattern_17

1 0
原创粉丝点击