JAVA设计模式-State

来源:互联网 发布:西安交通大学网络学校 编辑:程序博客网 时间:2024/04/30 20:44

一个对像有不同的状态,不同的状态有不同的行为。也许你会说在方法里加上switch case语句就行了,这样的确能实现这样的方法,但是,就像前面一些设计模式的目的一样,这种方法不具可扩展性,因此我们需要一种设计模式来实现这个功能,并且需要提供可扩展性,因此,就有了状态模式。

 

    来看一个例子:

 

   

view plain
  1. package state;  
  2.   
  3. interface State {       
  4.     public void fire();  
  5. }  
  6. class NormalState implements State {  
  7.     public void fire() {  
  8.         System.out.println("普通状态每秒开枪1次。");      
  9.     }  
  10. }  
  11. class ExcitedState implements State {  
  12.     public void fire() {  
  13.         System.out.println("兴奋状态每秒开枪2次。");        
  14.     }  
  15. }  
  16. class Marine {     
  17.     private State state;    
  18.     public Marine(State state){  
  19.         this.state = state;  
  20.     }     
  21.   
  22.     public void setState(State state) {          
  23.         this.state = state;       
  24.     }        
  25.     // fire()方法,实际调用的是state变量的fire()方法:     
  26.     public void fire() {          
  27.         state.fire();       
  28.     }  
  29. }  
  30. public class Test{  
  31.     public static void main(String[] args) {     
  32.         Marine marine = new Marine(new NormalState());    // 创建一个机枪兵的实例:   
  33.         marine.fire();    // 调用fire()方法:      
  34.         marine.setState(new ExcitedState()); // 设置为兴奋状态:      
  35.         marine.fire();   // 再调用fire()方法:  
  36.     }  
  37. }  

 

    在这个例子里面,士兵有两个状态。不同的状态,fire()方法是不同的,真正的fire()方法是定义在状态里的,因此,士兵类里的fire()方法只需要调用state.fire()就行了。这样设计的好处,就是让系统具有了可扩展性,当士兵有了新的状态的时候,只需要实现一个新的继承与State类的类就行了。那么士兵就自动具有了这个状态,不需要改动原有的代码。

 

    运行结果为:

 

普通状态每秒开枪1次。
兴奋状态每秒开枪2次。