State Pattern(状态模式)

/* *State Pattern 状态模式 *Defines: *Allows an object to alter its behavior when its internal state changes,the object will appear to change its class * *状态模式利用封装变化原则,把多个状态转化成类来实现,想想如果没有利用statePattern,一般效果是怎样: *1)大量if/else语句充斥在state变化当中,而且不是一个统一性的整体,某个状态可能需要多几个if/else而有些状态有可能少一两个if/else *这种情况下对于开发程序来说将是不堪设想的,当中的大部分ifelse可能还会碰到复杂的逻辑结构。 *2)对于调试以及测试代码来讲,将会非常复杂,因为大量的跳转以及if/else逻辑结构。 *3)对于将来可能的状态添加删除,会是一件非常头痛的事情,因为加入一个状态,就需要改变大量逻辑结构代码 * State Pattern 来说,就是利用了封装变化(encapsulate what varies)来实现 * state pattern抽象出一个高层state接口/类 * 然后将每个状态封装继承与state,这时,可以使各个状态是close for modified,状态与状态之间可以相互独立 * 这种情况下,添加/删除状态将变得简单,而且代码结构已经大量kill off if/else逻辑结构,出来的代码清晰 * * 下面是一个简单的模拟进程状态的程序 * SysState是抽象类 * 下面搭着几个状态类 * mysys是具体的一个process,通过test这个mysys的运行过程,可以看到其状态变化 * * 注意问题: * 1)状态转变封装到哪里?状态类or外部实现类。这是对于close-open原则考虑的,如果状态变化逻辑封装到状态类里面,则状态新的变化 * 会导致需要修改状态类,但外部实现调用状态的类就不会有影响,close for client * 如果状态变化逻辑放在外部调用类,则状态变化时,需要修改外部调用状态类达到逻辑,此时,close for state * 下面的测试是封装到state里面的,而client端不会知道状态是如何跳转的,它只管调用相应事件. * * 2)与策略模式对比:虽然从uml图上看来,两种模式结构基本一致,但是实际上,两者最大不同在于its intent。 * 状态模式:通过state接口,来一致处理state具体class的改变,他需要一套逻辑结构跳转,客户端可能不知道具体这个跳转方法。状态模式是使客户端在 * 一堆状态下跳转,不是为了通过状态模式而是不同的算法得一致的结果 * 而策略模式来说:通过interface来提供对算法的统一接口调度,但客户是应该知道具体调用哪个个算法,而且策略模式是通过调度该算法解决一个问题 */ abstract class SysState{ void permit(){ System.out.println("can not handle this request"); } void eventsReady(){ System.out.println("can not handle this request"); } void waitForEvents(){ System.out.println("can not handle this request"); } void processEnd(){ System.out.println("can not handle this request"); } void timeOut(){ System.out.println("can not handle this request"); } void timeCome(){ System.out.println("can not handle this request"); } } class Construct extends SysState{ private MySys mysys; public Construct(MySys s){ mysys = s; } public void permit(){ System.out.println("permin---------->"); mysys.setState(mysys.getReadyState()); } public String toString(){ String str = "Construct State"; return str; } } class Ready extends SysState{ private MySys mysys; public Ready(MySys s){ mysys = s; } public void timeCome(){ System.out.println("timeCome---------->"); mysys.setState(mysys.getRunState()); } public String toString(){ String str = "Ready State"; return str; } } class Run extends SysState{ private MySys mysys; public Run(MySys s){ mysys =s; } public void timeOut(){ System.out.println("timeOut---------->"); mysys.setState(mysys.getReadyState()); } public void processEnd(){ System.out.println("processEnd---------->"); mysys.setState(mysys.getEndState()); } public void waitForEvents(){ System.out.println("waitForEvents---------->"); mysys.setState(mysys.getBlockState()); } public String toString(){ String str = "Run State"; return str; } } class Block extends SysState{ private MySys mysys; public Block(MySys s){ mysys =s; } public void eventsReady(){ System.out.println("eventsReady---------->"); mysys.setState(mysys.getReadyState()); } public String toString(){ String str = "Block State"; return str; } } class End extends SysState{ private MySys mysys; public End(MySys s){ mysys = s; } public String toString(){ String str = "End State"; return str; } } public class MySys { /** * @param args */ private SysState constructState; private SysState readyState; private SysState runState; private SysState blockState; private SysState endState; private SysState currentState; public MySys(){ constructState = new Construct(this); readyState = new Ready(this); runState = new Run(this); blockState = new Block(this); endState = new End(this); currentState = constructState; } public String toString(){ return currentState.toString(); } public SysState getConstructState(){ return constructState; } public SysState getReadyState(){ return readyState; } public SysState getRunState(){ return runState; } public SysState getBlockState(){ return blockState; } public SysState getEndState(){ return endState; } public void setState(SysState s){ currentState = s; } public void permit(){ currentState.permit(); } public void timeOut(){ currentState.timeOut(); } public void timeCome(){ currentState.timeCome(); } public void processEnd(){ currentState.processEnd(); } public void waitForEvents(){ currentState.waitForEvents(); } public void eventsReady(){ currentState.eventsReady(); } public static void main(String[] args) { // TODO 自动生成方法存根 MySys myPro = new MySys(); System.out.println(myPro); myPro.permit(); System.out.println(myPro); myPro.timeCome(); System.out.println(myPro); myPro.timeOut(); System.out.println(myPro); myPro.timeCome(); System.out.println(myPro); myPro.waitForEvents(); System.out.println(myPro); myPro.eventsReady(); System.out.println(myPro); myPro.timeCome(); System.out.println(myPro); myPro.processEnd(); System.out.println(myPro); myPro.timeCome(); System.out.println(myPro); } }

你可能感兴趣的:(算法,String,object,Class,interface,behavior)