一、状态模式:改变对象的行为web
一个用来改变类的(状态的)对象。设计模式
2:问题:当你本身实现 State 模式的时候就会碰到不少细节的问题,你必须根据本身的须要选择合适的实现方法,ide
好比用到的状态(State)是否要暴露给调用的客户,以及如何使状态发生变化spa
用于改变状态的机制可能很简单也可能很复杂-好比状态机(State Machine)设计
三、代理(Proxy)设计模式其实是状态设计模式的一个特例代理
四、和策略模式Strategy的区别和联系(本段转载自:http://joe5456536.blog.163.com/blog/static/85374773201192252829941/)code
状态模式和策略模式的结构师彻底同样的,但它们的目的、实现、本质却彻底不同。orm
状态模式的行为是平行的,不可相互替换的;对象
而策略模式的行为是平等性的,是能够相互替换的。blog
五、类图以及UML(astah/jude)下载地址 :http://pan.baidu.com/s/1kTieTa3
六、示例:
通用状态规范
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()