状态模式
允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。状态模式是一种对象行为型模式。
涉及到的角色描述
(1)Context类,定义客户端所感兴趣的接口,并且内部维护一个具体状态类的实例,从而维护了对象的现有状态。
(2)State:抽象状态类或状态接口,用以抽象封装行为。
(3)ConcreteState类:具体状态类,实现了State中的抽象方法。
使用场景描述
(1)对象的行为依赖于它的状态,并且可以在运行时根据状态改变行为。
(2)代码中包含大量与对象状态有关的if/else语句,这些条件对应于对象的各种状态,这些冗余条件语句的出现导致代码的可维护性和灵活性变差,这种情况适合使用状态模式进行优化
优点
在不同状态需要有不同响应的使用场景下,避免了使用if/else导致代码臃肿,使代码结构清晰的同时保证了拓展性和维护性。
缺点
状态模式的使用必然会增加类和对象的个数,如果使用不当将导致程序结构和代码的混乱。
具体代码示例
state接口
package com.chenpt.designModel.stateModel;
/**
* @Author: chen
* @Description:
* @Date: created in 2018/8/31
* @Modified By:
*/
public interface State {
void doAction(Context context);
}
具体对象content
package com.chenpt.designModel.stateModel;
/**
* @Author: chen
* @Description:
* @Date: created in 2018/8/31
* @Modified By:
*/
public class Context {
private State state;
Context(){
this.state=null;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
}
状态A
package com.chenpt.designModel.stateModel;
/**
* @Author: chen
* @Description:
* @Date: created in 2018/8/31
* @Modified By:
*/
public class StateA implements State {
@Override
public void doAction(Context context) {
context.setState(this);
}
public String toString(){
return "this is stateA";
}
}
状态B
package com.chenpt.designModel.stateModel;
/**
* @Author: chen
* @Description:
* @Date: created in 2018/8/31
* @Modified By:
*/
public class StateB implements State {
@Override
public void doAction(Context context) {
context.setState(this);
}
public String toString(){
return "this is stateB";
}
}
客户端
package com.chenpt.designModel.stateModel;
/**
* @Author: chen
* @Description:
* @Date: created in 2018/8/31
* @Modified By:
*/
public class MainTest {
public static void main(String[] args){
Context context = new Context();
StateA stateA = new StateA();
StateB stateB = new StateB();
context.setState(stateA);
System.out.println(context.getState());
context.setState(stateB);
System.out.println(context.getState());
}
}
//执行结果
this is stateA
this is stateB