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

行为型模式

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("苹果");
    
}


运行结果为:

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