首页 > 代码库 > 23状态模式
23状态模式
1状态模式的核心内容是:
A:状态类
B:工作类
2状态模式的作用:通过状态值自动跳转到要执行的类。
3状态模式具体描述
状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。
这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行
为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的
一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,
其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的
子类。当系统的状态变化时,系统便改变所选的子类。
跟MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,
比如你约她今天晚上去看电影,对你没兴趣的MM就会说“有事情啦”
,对你不讨厌但还没喜欢上的MM就会说“好啊,不过可以带上我同事么?”
,已经喜欢上你的MM就会说“几点钟?看完电影再去泡吧怎么样?”,
当然你看电影过程中表现良好的话,也可以把MM的状态从不讨厌不喜欢变成喜欢哦。
4状态模式类图
5.代码:
#include<iostream>
#include<string>
usingnamespacestd;
//状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。
//这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行
//为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的
//一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,
//其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的
//子类。当系统的状态变化时,系统便改变所选的子类。
//
//跟MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,
//比如你约她今天晚上去看电影,对你没兴趣的MM就会说“有事情啦”
//,对你不讨厌但还没喜欢上的MM就会说“好啊,不过可以带上我同事么?”
//,已经喜欢上你的MM就会说“几点钟?看完电影再去泡吧怎么样?”,
//当然你看电影过程中表现良好的话,也可以把MM的状态从不讨厌不喜欢变成喜欢哦。
classWork;
classState;
classForenonnState;
classState
{
public:
//准柜台的基类,抽象类
virtualvoidwriteProgram(Work *) = 0;
};
//实施工作的类,根据状态执行不同的操作
classWork
{
public:
inthour;
State *current;
Work();
voidwriteProgram()
{
current->writeProgram(this);
}
};
//晚上状态
classEveningState :publicState
{
public:
voidwriteProgram(Work *w)
{
cout <<"当前时间: " << w->hour << "心情很好,在看《明朝那些事儿》,收获很大!" << endl;
}
};
//下午的状态
classAfternoonState :publicState
{
public:
voidwriteProgram(Work *w)
{
if (w->hour < 19)
{
cout <<"当前时间:" << w->hour << "下午午睡后,工作还是精神百倍!" << endl;
}
else
{
w->current = newEveningState();
w->writeProgram();
}
}
};
//上午的状态
classForenoonState :publicState
{
public:
voidwriteProgram(Work *w)
{
if (w->hour < 12)
{
cout <<"当前时间:" << w->hour << "上午工作精神百倍!" << endl;
}
else
{
w->current = newAfternoonState();
w->writeProgram();
}
}
};
Work::Work()
{
current =newForenoonState();
}
intmain()
{
Work *w =newWork();
w->hour = 21;
//通过状态模式自动跳转到要执行的类
w->writeProgram();
cin.get();
return 0;
}
运行结果如下:
23状态模式