1、状态模式:改变对象的行为
一个用来改变类的(状态的)对象。
2:问题:当你自己实现 State 模式的时候就会碰到很多细节的问题,你必须根据自己的需要选择合适的实现方法,
比如用到的状态(State)是否要暴露给调用的客户,以及如何使状态发生变化
用于改变状态的机制可能很简单也可能很复杂-比如状态机(State Machine)
3、代理(Proxy)设计模式实际上是状态设计模式的一个特例
4、和策略模式Strategy的区别和联系(本段转载自:http://joe5456536.blog.163.com/blog/static/85374773201192252829941/)
状态模式和策略模式的结构师完全一样的,但它们的目的、实现、本质却完全不一样。
状态模式的行为是平行的,不可相互替换的;
而策略模式的行为是平等性的,是可以相互替换的。
5、类图以及UML(astah/jude)下载地址 :http://pan.baidu.com/s/1kTieTa3
6、示例:
通用状态规范
1 package com.xinye.test.state; 2 /** 3 * 所有的状态都具有的行为规范 4 * @author xinye 5 * 6 */ 7 public interface IState { 8 public void operator(); 9 }
第一种状态
1 package com.xinye.test.state; 2 3 /** 4 * 第一种状态 5 * @author xinye 6 * 7 */ 8 public class FirstState implements IState { 9 10 @Override 11 public void operator() { 12 System.out.println(getClass().getSimpleName() + " operator()"); 13 } 14 15 }
第二种状态
package com.xinye.test.state; /** * 第二种状态 * @author xinye * */ public class SecondState implements IState { @Override public void operator() { System.out.println(getClass().getSimpleName() + " operator()"); } }
第三种状态
1 package com.xinye.test.state; 2 3 /** 4 * 第三种状态 5 * @author xinye 6 * 7 */ 8 public class ThirdState implements IState { 9 10 @Override 11 public void operator() { 12 System.out.println(getClass().getSimpleName() + " operator()"); 13 } 14 15 }
状态模式Context(执行具体的方法的时候,需要传递相应的状态代码,个人感觉最好能定义出来一个Enum来规范)
1 package com.xinye.test.state; 2 /** 3 * 状态上下文 4 * @author xinye 5 * 6 */ 7 public class Context { 8 9 private IState state = null; 10 /** 11 * 执行操作 12 * @param _state 哪一种状态 13 */ 14 public void exec(int _state){ 15 if(1 == _state){ 16 state = new FirstState(); 17 }else if(2 == _state){ 18 state = new SecondState(); 19 }else{ 20 state = new ThirdState(); 21 } 22 state.operator(); 23 } 24 }
客户端代码
1 package com.xinye.test.state; 2 /** 3 * 客户端代码 4 * @author xinye 5 * 6 */ 7 public class Client { 8 public static void main(String[] args) { 9 Context context = new Context(); 10 11 context.exec(1); 12 context.exec(2); 13 context.exec(3); 14 } 15 }
执行结果:
FirstState operator()
SecondState operator()
ThirdState operator()
-------------------------------------------------------------------------------------------
另一种Context和Client
1 package com.xinye.test.state; 2 /** 3 * 第二种状态模式的实现 4 * @author xinye 5 * 6 */ 7 public class Context_2 { 8 private IState state = new FirstState(); 9 10 public void exec(){ 11 state.operator(); 12 // 其他代码 13 // *** 14 changeState(); 15 16 } 17 private void changeState(){ 18 if(state instanceof FirstState){ 19 state = new SecondState(); 20 }else if(state instanceof SecondState){ 21 state = new ThirdState(); 22 }else{ 23 state = new FirstState(); 24 } 25 } 26 } 27 28 package com.xinye.test.state; 29 30 public class Client_2 { 31 public static void main(String[] args) { 32 Context_2 context2 = new Context_2(); 33 context2.exec(); 34 context2.exec(); 35 context2.exec(); 36 context2.exec(); 37 context2.exec(); 38 } 39 }
执行结果:
FirstState operator()
SecondState operator()
ThirdState operator()
FirstState operator()
SecondState operator()