什么是状态模式?
他允许对象在内部状态改变时改变他的行为,对象看起来好像修改了它的类。
比如说,一个类在运行时会根据某个属性的状态值做出不同的反应,我们可以用 if 做判断,每个状态做出对应的行为动作。
//执行类
class Executer{
int state;
method(){
if(state == 0){
...
}else if(state == 1){
...
}else if(state == 2){
...
}else if...
}
}
但是状态模式会把这部分抽取到一个状态 interface,内部声明一系列方法,然后创建子类去实现它,每个子类代表一种状态,原来的运行代码中就可以动态的注入状态类对象,只要调用这个对象的方法就行了,不用大量的 if 判断。例:
//状态接口
interface State{
execute();
}
//状态类
class StateA implements State{
final int state = 0;
Executer ex;
execute(){
//实现逻辑
//可以用 ex 改变状态
}
}
//改造一下执行类
class Executer{
State state;
method(){
...
state.execute();
...
}
}
把变化的部分封装到接口中,然后具体的行为委托给注入进来的 State 对象,这听起来就像是策略模式。而且和命令模式也很像,可以把 State 看做一个命令啊,然后通过注入的 State 对象的执行方法完成调用。真的傻傻分不清楚,此时需要从目的上分析了。
策略模式,是为了给不同的类定义行为。
命令模式,是为了封装调用,甚至可以实现撤销。
状态模式,则是为了类能够根据状态的改变完成不同的行为,必要时执行方法可以触发状态的改变。
这么一说好像有点这个意思:没错,是很相似,但是做不同的事就有不同的叫法。。。
网友评论