Java设计形式之State(状态模式)

Java设计模式之State(状态模式)

定义: GOF《设计模式》中给状态模式下的定义为:允许一个对象在其内部状态改变时改变它的行为。

 

先看一个例子:

 

view plain
  1. package com.state;  
  2. public class KissingPrincess {  
  3.     // 标志位,标志是青蛙还是王子。  
  4.     private boolean isFrog = true;  
  5.     // 根据isFrog进行不同的操作。  
  6.     public void greet() {  
  7.         if (isFrog)  
  8.             System.out.println("frog!");  
  9.         else  
  10.             System.out.println("prince!");  
  11.     }  
  12.     // 将isFrog设置成false。  
  13.     public void kiss() {  
  14.         isFrog = false;  
  15.     }  
  16.       
  17.     // 主函数。  
  18.     public static void main(String[] args) {  
  19.         KissingPrincess prince = new KissingPrincess();  
  20.         prince.greet();  
  21.         prince.kiss();  
  22.         prince.greet();  
  23.     }  
  24. }  

 

输出结果:

frog!
prince!

 

这个例子中,用了一个变量isFrog来标识是青蛙还是王子,如果是王子的话,输出"prince!",是青蛙的话,输出:“frog!”。

本例中的写法,用个朋友的话来说,只是“入门级程序员的写法”。在java中,要时时注意OOP(Object Oriented Programming)的概念。

如果状态很多的话,就会使用很多if else 语句,不仅繁琐难于维护,而且没有体现出面向对象编程的思想。

 

对上例应用状态模式后,可以变成如下的代码:

 

view plain
  1. package com.state;  
  2. public class KissingPrincess2 {  
  3.       
  4.     private State state = new Frog();  
  5.       
  6.     private interface State {  
  7.         void response();  
  8.     }  
  9.       
  10.     private class Frog implements State {  
  11.           
  12.         @Override  
  13.         public void response() {  
  14.             System.out.println("frog!");  
  15.         }  
  16.     }  
  17.       
  18.     private class Prince implements State {  
  19.           
  20.         @Override  
  21.         public void response() {  
  22.             System.out.println("prince!");  
  23.         }  
  24.     }  
  25.       
  26.     public void greet() {  
  27.         state.response();  
  28.     }  
  29.       
  30.     public void change(State state) {  
  31.         this.state = state;  
  32.     }  
  33.       
  34.     public static void main(String[] args) {  
  35.         KissingPrincess2 prince2 = new KissingPrincess2();  
  36.         prince2.greet();  
  37.         prince2.change(prince2.new Prince());  
  38.         prince2.greet();  
  39.     }  
  40. }  

 

 

输出结果:

frog!
prince!

 

上述例子就是state模式的基本思想,希望读者朋友们认真体会。

 

这里再举个state模式的例子:

玩过cs的人都知道,cs里面有很多枪,ak47啊,m16啊,但是不管什么枪,你拿起以后,都只用扣动扳机就能够把子弹打出去。这就和我们state模式思想是一样的,不管底层怎么实现(比如上述例子中的判断是frog还是prince,然后执行不同的操作),外层的接口都不变(greet方法)。