目录
概念
状态模式:当一个对象在内在状态改变时允许改变其行为,这个行为看起来像是改变了其类
状态! 顾名思义 , 一个对象在一段时间所呈现的不同形态 。 比如:
电梯状态 : 有上升 、下降、停止、运行 四个状态。
一个人的工作状态 : 早上很清晰 , 中午犯困 , 下午饿了!? 晚上又困了!
……
模式结构
将特定的状态相关的行为都放入一个对象中 , 由于所有与状态相关的代码都存在于某个 State 中 , 所以通过定义新的子类可以很容易地添加新的状态和转换。
状态模式通过把各种状态转移逻辑到State的子类之间 , 来减少依赖
什么时候用状态模式呢 ?
答: 当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时候,就可以考虑使用状态模式了。
案例示范
talk is easy , show me the code!
背景:一个人在早上或者中午、下午、晚上有诸多状态 , 我们以此为例,展示本模式
创建State抽象类
public abstract class State {
public abstract void proggram(Work work);
}
创建状态类 并 继承于 State
// 早上状态
public class ForenoonState extends State{
@Override
public void proggram(Work work) {
if(work.getHour() < 12) {
System.out.println("早上 , 精神好");
}else {
work.setState(new NoonState());
work.excute();
}
}
}
// 中午状态
public class NoonState extends State{
@Override
public void proggram(Work work) {
if(work.getHour() < 13) {
System.out.println("中午啦,有点困了");
}else {
work.setState(new AfterState());
work.excute();
}
}
}
// 下午状态
public class AfternoonState extends State{
@Override
public void proggram(Work work) {
System.out.println("下午了");
}
}
创建Context类 (此处为Work)
public class Work {
int hour;
private State state;
public Work(){
state = new ForenoonState();
}
public int getHour() {
return hour;
}
public void setHour(int hour) {
this.hour = hour;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public void excute(){
state.proggram(this);
}
}
客户端代码
public class Client {
public static void main(String[] args) {
Work work = new Work();
work.setHour(13);
work.excute();
}
}
// 结果 :下午了
用状态模式, 将工作状态与相关的行为 (早上了 ,中午了……)局部化 , 将不同状态的行为分隔开来。