设计模式之(十七)状态模式State

由简单的开始会比较好理解状态模式的作用,先来看一个列子如果你有一个只能顺时针转动的瓦斯开关,转动一次的状态为OFF Small fire 与 large fire ,你如何在程序中控制状态于行为变化呢?

一个最简单的方式就是用if else 或是sweitch如

enum DocumentState
{
    Readonly,
    Editable
}

public class Document
{
   DocumentState State;
   public void Handle()
  {
    if(state.Readonly == state)
    {
      
    }
    if(state.Editable == state)
    {
      
    }
} }

文档增加一种新的状态,如Printing时,由于紧耦合的存在,将需要同时破坏原枚举类型和Document类两个对象。采用State 模式的情况

abstract class StatedDocument

{

  public abstract void Handle1();

  public abstract void handle2();

  public StatedDocument NextState{set;}//状态流转后更改到新的状态

public class ReadonlyDocument:StatedDocument{}

public class EditableDocument:StatedDocement{}

public class Document

{

  //当文档改变时,只需要设置这个对象

  //新的statedDocument的只就可以啦

  StateDocument statedDocument{set;}

  public void Handle1()

  {

    statedDocument.Handle1();

  }

  public void Handle2()

  {

    statedDocument.Handle2();

  }

}

  在这种模式,我们只需要增加一个继承自StatedDocument的printingDocument类,在调用时给Document对象在statedDocument属性赋值就可以啦。同时我们可以在StateDocument类中预定义到状态的切换。

posted on 2012-05-15 14:47  361741352  阅读(170)  评论(0编辑  收藏  举报

导航