你的位置:首页 > ASP.net教程

[ASP.net教程]设计模式学习之01状态模式


主体思想:状态决定行为。

应用环境:同一对象,在状态转换过程中,行为随着状态一直在改变。

e.g.  灯初始状态是关闭的,按一下开启,再按一下关闭(不要跟我说你家的水晶变色大灯)。在这一个过程中,触发行为都是按一下开关,电灯会根据自身状态的不同调用不同的行为去实现。如果我们不适用设计模式去实现着这段逻辑,一般就是这两种实现方法吧

1.

if(灯状态==XXX){....}else{XXXXXXXX}

2.

switch(灯状态){case XX:   Xxxxxx   break;case vv:    vvvvvvvv    break;default:    llllll}

目前就是灯打开,关闭两个状态,咱们当然可以用这种if ,switch的方式来做。 如果实体对象状态很多的话,采用上面判断的方式,一个类方法的代码就老长老长了。ok ,那么咱们采用状态模式来看看,该如何实现。

1.分析需求,设计类

状态模式,毫无疑问,咱们需要实体类(Light),状态类(LightState)。由于状态类,会有不同状态,相同的按灯动作。因此我们这么设计。

抽象状态类:

 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6  7 namespace DesignModel_01 8 { 9  abstract  class LightState10   {11    public abstract void PushClick(Light light);12   }13 }

实体类:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace DesignModel_01{  class Light  {    private LightState state;    public Light(LightState state)    {      this.State = state;    }    public LightState State    {      get      {        return state;      }      set      {        state = value;      }    }    public void LightClick()    {      this.state.PushClick(this);    }  }}

好了,主要工作完成,下面就是具体灯的那个状态了。目前就两种状态,打开关闭。

LightOn :
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace DesignModel_01{  class LightOn : LightState  {    public override void PushClick(Light light)    {      Console.WriteLine("灯正在关闭ing...");      light.State = new LightOff();      Console.WriteLine("灯已经关闭...");    }  }}



LightOff :
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace DesignModel_01{  class LightOff : LightState  {    public override void PushClick(Light light)    {      Console.WriteLine("灯正在打开ing...");      light.State = new LightOpen();      Console.WriteLine("灯已经打开...");    }  }}

测试man:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace DesignModel_01{  class Program  {    static void Main(string[] args)    {      Light l = new Light(new LightOpen());      for (int i = 0; i < 10; i++)      {        l.LightClick();      }      Console.ReadLine();    }    }}

 

 

好吧,打脸了。。。。代码似乎比if,switch 判断还多。所以应对不同的业务场景,我们还是要理智的采用不同的方案。

优点

    a 状态模式将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。

    b 所有状态相关的代码都存在于某个ConcereteState中,所以通过定义新的子类很容易地增加新的状态和转换。

    c 状态模式通过把各种状态转移逻辑分不到State的子类之间,来减少相互间的依赖。

缺点

     a 导致较多的ConcreteState子类

适用场景

    a 当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式来。

    b 一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态。

 

内容参考:

 

http://www.cnblogs.com/god_bless_you/archive/2010/06/06/1752517.html