行为型模式
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("苹果");
- }
运行结果为:
来源: http://www.bubuko.com/infodetail-3340153.html