行为型模式之状态模式
一.定义
状态模式(State Pattern) :允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象(Objects for States),状态模式是一种对象行为型模式。
二、模式结构成员构成
• Context: 环境类
• State: 抽象状态类
• ConcreteState: 具体状态类
三.代码示例
1 /** 2 * State 3 * 抽象状态类 4 */ 5 public interface State { 6 public void doAction(Context context); 7 } 8 9 /** 10 * ConcreteState 11 * 具体状态类 12 */ 13 public class StartState implements State { 14 15 @Override 16 public void doAction(Context context) { 17 System.out.println("Player is in start state"); 18 context.setState(this); 19 } 20 21 @Override 22 public String toString(){ 23 return "Start State"; 24 } 25 } 26 27 /** 28 * ConcreteState 29 * 具体状态类 30 */ 31 public class StopState implements State { 32 33 @Override 34 public void doAction(Context context) { 35 System.out.println("Player is in stop state"); 36 context.setState(this); 37 } 38 39 @Override 40 public String toString(){ 41 return "Stop State"; 42 } 43 } 44 45 /** 46 * Context 47 * 环境类 48 */ 49 public class Context { 50 private State state; 51 52 public Context(){ 53 state = null; 54 } 55 56 public void setState(State state){ 57 this.state = state; 58 } 59 60 public State getState(){ 61 return state; 62 } 63 } 64 65 /** 66 * client 67 */ 68 public class Client { 69 70 public static void main(String[] args) { 71 Context context = new Context(); 72 73 StartState startState = new StartState(); 74 startState.doAction(context); 75 76 System.out.println(context.getState().toString()); 77 78 StopState stopState = new StopState(); 79 stopState.doAction(context); 80 81 System.out.println(context.getState().toString()); 82 } 83 }
四.优点和缺点分析
优点:
>枚举可能的状态,在枚举状态之前需要确定状态种类。
>将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为.
>允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句
>可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数
>封装了转换规则
缺点:
>状态模式的使用必然会增加系统类和对象的个数
>状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱
五.应用场景
>对象的行为依赖于它的状态(属性)并且可以根据它的状态改变而改变它的相关行为
>代码中包含大量与对象状态有关的条件语句,这些条件语句的出现,会导致代码的可维护性和灵活性变差,不能方便地增加和删除状态,使客户类与类库之间的耦合增强。在这些条件语句中包含了对象的行为,而且这些条件对应于对象的各种状态
你投入得越多,就能得到越多得价值