码迷,mamicode.com
首页 > 编程语言 > 详细

【c++设计模式】状态模式

时间:2019-12-19 23:03:43      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:str   基类   管理类   lis   使用   苹果   etl   info   turn   

行为型模式

17)状态模式

本文主要参考:

https://www.cnblogs.com/lizhanwu/p/4437532.html

当某一个类在不同状态下表现出不同的行为时,可以考虑使用状态模式。如果简单的用庞大的if-else状态分支来切换对象的行为,那么每增加一个新的状态都要修改原来的代码。
状态模式则包含了一个状态的虚基类,每增加一种新的状态新建一个类即可。

状态模式包含三种角色:
第一种,抽象状态类,是各种状态的基类。
第二种,具体状态类,里面包含某种状态下对象的各种行为。
第三种,状态管理类,这个类里包含了抽象状态类的指针。

以一个多语种的词典的翻译为例,在不同的语言模式下会做不同的翻译。

class Dictionary;
//抽象状态类
class Languge{
public:
    virtual string translate(Dictionary* d, string word) = 0;
};

//状态管理类
class Dictionary{
public:
    Languge* current_lang;
    
    Dictionary(Languge* l):current_lang(l){}
    void setLang(Languge* l){
        current_lang = l;
    }
    
    void printTitle()
    {
        cout<<"欢迎使用字典"<<endl;
    }
    void translate(string word){
        string ans = current_lang->translate(this, word);
        cout<<word<<"翻译为: "<<ans<<endl;
    }
};


//具体状态类
class English: public Languge{
public:
    string translate(Dictionary* d, string word)
    {
        d->printTitle();
        if(word=="你好")
            return "hello";
        else
            return "sorry, this word is not in the dictionnary";
    }
};

//具体状态类
class French : public Languge{
public:
    string translate(Dictionary* d,string word){
        d->printTitle();
        if(word=="你好")
            return "Bonjour";
        else
            return "Désolé, ce mot n'est pas dans ce dictionnaire";
    }
};

//具体状态类
class Espagnol : public Languge{
public:
    string translate(Dictionary* d,string word){
        d->printTitle();
        if(word=="你好")
            return "Hola";
        else
            return "Lo siento, la palabra no está en el diccionario.";
    }
};

int main()
{
    Languge* english = new English();
    Languge* french = new French();
    Languge* espagnol = new Espagnol();
    Dictionary* d = new Dictionary(english);
    
    d->translate("你好");
    d->translate("苹果");
    
    d->setLang(french);
    d->translate("你好");
    d->translate("苹果");
    
}

运行结果为:
技术图片

【c++设计模式】状态模式

标签:str   基类   管理类   lis   使用   苹果   etl   info   turn   

原文地址:https://www.cnblogs.com/corineru/p/12070511.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!