JAVA-设计模式-状态模式6(引发深思)

状态模式

当对象的状态改变时,同时改变其行为。


抽象状态类

/** * 抽象状态类 */ public abstract class AbstractState { /** * 状态行为抽象方法,由具体的状态子类去实现不同的行为逻辑 */ public abstract void Behavior(); }

实现类A

/** * 具体的状态子类A */ public class StateA extends AbstractState { @Override public void Behavior() { System.out.println("StateA................."); } }

实现类B

/** * 具体的状态子类B */ public class StateA extends AbstractState { @Override public void Behavior() { System.out.println("StateB................."); } }

对象环境类:

public class Context { // 维护一个抽象状态对象的引用 private AbstractState state; /* * 模拟属性 */ private int type; /** * 环境处理函数,调用状态实例行为 完成业务逻辑
* 根据不同的状态实例引用 在不同状态下处理不同的行为 */ public void Handle(){ checkState(); state.Behavior(); } /** * 检查环境状态:状态的改变/切换 在环境类中实现 */ private void checkState(){ if(type==1){ setState(new ConcreteStateA()); } else { setState(new ConcreteStateB()); } } /** * 设置环境状态 */ private void setState(State state){ this.state = state; } public double getType() { return type; } public void setType(int type) { this.type= type; } }

测试类:

public class Client { public static void main(String[] args) { Context context = new Context(); context.setType(1); System.out.println("当前属性:" + context.getType() ); context.Handle(); context.setType(2); System.out.println("当前属性:" + context.getType() ); context.Handle(); } } 当前属性:1 StateA................. 当前属性:2 StateB.................

优点

面向接口式编程,将实现细节巧妙封装在各个不同的状态类中,状态转换交给状态类自己去实现,外部无需关心

将由大量业务、大量逻辑判断的代码去除,状态类内部通过状态的转换实现相关逻辑,代码可读性更好;

缺点

增加新的状态时会增加状态类,而且在增加新的状态类之后,环境类需要做相应的修改,不太符合开闭原则;

请大家关注,好好学习!