Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6005884
  • 博文数量: 2759
  • 博客积分: 1021
  • 博客等级: 中士
  • 技术积分: 4091
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-11 14:14
文章分类

全部博文(2759)

文章存档

2019年(1)

2017年(84)

2016年(196)

2015年(204)

2014年(636)

2013年(1176)

2012年(463)

分类: Java

2014-03-06 02:31:27

状态模式也属于行为类设计模式,它的使用方式跟策略模式颇为相似,首先咱们还是先看下GOF对状态模式的定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式中的行为是由状态来决定的,不同的状态对应了不同的行为。状态模式和策略模式的结构几乎完全一样,但它们的目的、本质却完全不一样。状态模式的行为是平行的不可替换的,策略模式的行为是彼此独立可相互替换的。
首先看下状态模式的结构图:

状态模式的角色:
(1)上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。 
(2)抽象状态角色(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。
(3)具体状态角色(ConcreteState):实现抽象状态定义的接口。
下面看状态模式的具体代码实现:
1、第一个文件IWaterState.java

点击(此处)折叠或打开

  1. /**
  2.  * 水的状态
  3.  */
  4. public interface IWaterState {

  5.     /**
  6.      * 输出水的状态
  7.      */
  8.     public void printState();
  9. }
2、第二个文件IceWaterStateImpl.java 

点击(此处)折叠或打开

  1. /**
  2.  * 冰水状态实现类
  3.  */
  4. public class IceWaterStateImpl implements IWaterState {

  5.     @Override
  6.     public void printState() {
  7.         // TODO Auto-generated method stub
  8.         System.out.println("水的状态:冰水!");
  9.     }

  10. }
3、第三个文件WarmWaterStateImpl.java 

点击(此处)折叠或打开

  1. /**
  2.  * 温水状态实现类
  3.  */
  4. public class WarmWaterStateImpl implements IWaterState {

  5.     @Override
  6.     public void printState() {
  7.         // TODO Auto-generated method stub
  8.         System.out.println("水的状态:温水!");
  9.     }

  10. }
4、第四个文件WasteWaterStateImpl.java

点击(此处)折叠或打开

  1. /**
  2.  * 沸水状态实现类
  3.  */
  4. public class WasteWaterStateImpl implements IWaterState {

  5.     @Override
  6.     public void printState() {
  7.         // TODO Auto-generated method stub
  8.         System.out.println("水的状态:沸水!");
  9.     }

  10. }
5、第五个文件WaterContext.java

点击(此处)折叠或打开

  1. /**
  2.  * 状态上下文实现
  3.  */
  4. public class WaterContext {

  5.     /**
  6.      * 状态对象
  7.      */
  8.     private IWaterState state = null;
  9.     
  10.     /**
  11.      * 设置状态对象
  12.      * @param i
  13.      */
  14.     public void setState(int i){
  15.         if(i == 0){
  16.             state = new IceWaterStateImpl();
  17.             System.out.println("正在加热...");
  18.         }else if(i == 1){
  19.             state = new WarmWaterStateImpl();
  20.             System.out.println("正在加热...");
  21.         }else if(i == 2){
  22.             state = new WasteWaterStateImpl();
  23.             System.out.println("加热完成!");
  24.         }
  25.     }
  26.     
  27.     /**
  28.      * 获得状态对象
  29.      * @return
  30.      */
  31.     public IWaterState getState(){
  32.         return state;
  33.     }
  34.     
  35. }
6、第六个文件TestMain.java

点击(此处)折叠或打开

  1. /**
  2.  * 测试Main方法
  3.  */
  4. public class TestMain {

  5.     public static void main(String [] args){
  6.         IWaterState state = null;
  7.         for(int i=0;i<3;i++){
  8.             try {
  9.                 WaterContext context = new WaterContext();
  10.                 context.setState(i);
  11.                 state = context.getState();
  12.                 state.printState();
  13.                 Thread.sleep(1000);
  14.             } catch (InterruptedException e) {
  15.                 // TODO Auto-generated catch block
  16.                 e.printStackTrace();
  17.             }
  18.         }
  19.     }
  20.     
  21. }
看了如上代码,我们发现状态模式真的和策略模式极为相似,但其实虽然用法上相似,但思想层面上却极为不同。它们所解决的问题不同:状态模式,解决内在状态的改变,状态变化则行为变化,客户端调用时可能会在一个调用过程中出现不同状态而调用不同的行为。策略模式,解决内部算法的改变,客户端选择具体实现算法,选择完后不会再改变。它们解决问题的方法不同:状态模式,通常是自我控制状态的改变(通常由Context类判断状态的变化)。策略模式,由外部指定使用什么样的策略(通常由客户端传入参数,Context根据外界需求生成具体实现对象)。
7、状态模式的适用场景:
状态模式适用于一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。
8、状态模式的优点:
(1)状态模式将不同状态所对应的行为彼此分隔开来,降低程序的耦合,从而在新增或修改状态时,可以避免程序互相影响。
(2)状态模式将状态的逻辑处理变化交由上下文对象Context管理,便于客户端的调用。
9、状态模式的缺点:
不同的状态对应不同的类文件,增加了系统文件个数,不便于维护管理。
阅读(1195) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~