标签:str 基类 管理类 lis 使用 苹果 etl info turn
本文主要参考:
当某一个类在不同状态下表现出不同的行为时,可以考虑使用状态模式。如果简单的用庞大的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("苹果");
}
运行结果为:
标签:str 基类 管理类 lis 使用 苹果 etl info turn
原文地址:https://www.cnblogs.com/corineru/p/12070511.html