状态模式

状态模式

定义:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

角色
  1. context应用环境:内部持有多个state的引用以及代表当前状态的应用
  2. state状态接口:定义了所有具体状态的共同接口,任何状态都要实现这个接口,以便,状态之间相互替代。
  3. concreteState具体状态:处理来自context的请求,每个concreteState都提供了自己对于请求的实现,所有,当context改变状态是,行为也会跟着改变。
优点
  1. 它将与特定状态相关的行为局部化,并且将不同状态的行为分割开来
  2. 它使得状态转换显式化
  3. State对象可被共享
缺点 :
  1. 状态模式的使用必然会增加系统类和对象的个数。
  2. 状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。
应用场景
  1. 一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。
  2. 代码中包含大量与对象状态有关的条件语句
状态模式与策略模式
  1. 两者类图相同。
  2. 两者意图不同。
    状态模式中,context的行为可以委托到所有状态中的任意一个,一般地,当前状态会自发地再各个状态之间游走(比如:饿,吃饭,到饱),不必context去特意指定。而且,context内会包含多个state的引用。在策略模式中,context通常为了实现某一种算法、策略,会自动指定特定的策略对象。一般,context只包含一个策略对象的引用。
  3. 一般来说,我们把策略模式想成是除里继承之外的一种弹性替代方案。而把状态模式想成是不用再context中放置许多判断条件的替代方案。
代码示例
[java]  view plain copy
  1. /** 
  2.  * 猪的状态接口 
  3.  *  
  4.  * @author sky 
  5.  *  
  6.  */  
  7. public interface PigState {  
  8.   
  9.     public void eat();  
  10.   
  11.     public void sleep();  
  12.   
  13. }  
  14.   
  15. /** 
  16.  * 猪饿的状态 
  17.  *  
  18.  * @author sky 
  19.  *  
  20.  */  
  21. public class HungerState implements PigState {  
  22.   
  23.     private Pig pig;  
  24.   
  25.     public HungerState(Pig pig) {  
  26.         this.pig = pig;  
  27.     }  
  28.   
  29.     @Override  
  30.     public void eat() {  
  31.         System.out.println("猪饿了,吃食。。。。。变饱了。");  
  32.         pig.setNowState(pig.getFull());  
  33.     }  
  34.   
  35.     @Override  
  36.     public void sleep() {  
  37.         System.out.println("猪饿了,睡不着。");  
  38.     }  
  39.   
  40. }  
  41.   
  42. /** 
  43.  * 猪饱的状态 
  44.  *  
  45.  * @author sky 
  46.  *  
  47.  */  
  48. public class FullState implements PigState {  
  49.   
  50.     private Pig pig;  
  51.   
  52.     public FullState(Pig pig) {  
  53.         this.pig = pig;  
  54.     }  
  55.   
  56.     @Override  
  57.     public void eat() {  
  58.         System.out.println("猪很饱,吃不下。");  
  59.     }  
  60.   
  61.     @Override  
  62.     public void sleep() {  
  63.         System.out.println("猪睡了一觉。。。。又饿了。");  
  64.         pig.setNowState(pig.getHunger());  
  65.     }  
  66.   
  67. }  
  68.   
  69.   
  70. /** 
  71.  * 猪 
  72.  *  
  73.  * @author sky 
  74.  *  
  75.  */  
  76. public class Pig {  
  77.   
  78.     private PigState hunger;  
  79.   
  80.     private PigState full;  
  81.   
  82.     private PigState nowState;  
  83.   
  84.     public Pig() {  
  85.         hunger = new HungerState(this);  
  86.         full = new FullState(this);  
  87.         nowState = hunger;  
  88.     }  
  89.   
  90.     public PigState getNowState() {  
  91.         return nowState;  
  92.     }  
  93.   
  94.     public void setNowState(PigState nowState) {  
  95.         this.nowState = nowState;  
  96.     }  
  97.   
  98.     public void eat() {  
  99.         nowState.eat();  
  100.     }  
  101.   
  102.     public void sleep() {  
  103.         nowState.sleep();  
  104.     }  
  105.   
  106.     public PigState getHunger() {  
  107.         return hunger;  
  108.     }  
  109.   
  110.     public PigState getFull() {  
  111.         return full;  
  112.     }  
  113. }  
  114.   
  115. /** 
  116.  * 测试类 
  117.  *  
  118.  * @author sky 
  119.  *  
  120.  */  
  121. public class Test {  
  122.   
  123.   
  124.     public static void main(String[] args) {  
  125.         Pig pig = new Pig();  
  126.         pig.sleep();  
  127.         pig.eat();  
  128.         pig.eat();  
  129.         pig.sleep();  
  130.   
  131.     }  
  132. }  
  133.   
  134. 输出:  
  135.     猪饿了,睡不着。  
  136.     猪饿了,吃食。。。。。变饱了。  
  137.     猪很饱,吃不下。  
  138.     猪睡了一觉。。。。又饿了。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值