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

状态模式

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

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.................
 

优点

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

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

缺点

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

请大家关注,好好学习!


分享到:


相關文章: