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

    运行结果为:

  • 相关阅读:
    LeetCode 222.完全二叉树的节点个数(C++)
    LeetCode 704.二分查找(C++)
    LeetCode 441.排列硬币(C++)
    LeetCode 981.基于时间的键值存储(C++)
    LeetCode 167.两数之和(C++)
    LeetCode 367.有效的完全平方数(C++)
    LeetCode 881.救生艇(C++)
    LeetCode 860.柠檬水找零(C++)
    LeetCode 870.优势洗牌(C++)
    bootstrap
  • 原文地址:https://www.cnblogs.com/corineru/p/12070511.html
Copyright © 2020-2023  润新知