状态模式
允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。状态模式是一种对象行为型模式。
涉及到的角色描述
(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
扫描二维码关注公众号,回复:
3035721 查看本文章
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