设计模式学习--状态模式(State Pattern)

概念

状态模式(State Pattern):允许对象在其内部状态改变时改变它的行为和特性,对象看起来好像修改了它的类.

问题

在某些组件内部,可以通过不同的状态修改组件的行为特性,让它看起来似乎是修改了对象类型的结构和行为.当你在一个对象的方法中使用选择语句来确定不同的状态下有不同的行为和特性时,可以考虑应用状态模式.

一般情况下,可以在状态中定义与对象中一一对应的方法,以确定对象在不同的状态下各个方法的行为方式.

如果状态的影响有一定的规则,可以在状态 类中使用一个方法来完成

 

解决方案

首先,我们定义状态接口IState

//状态模式模型,接口

public interface IState

{

 void DoWork(); int ChangeValue(int val);

}

然后是状态基类CState,与一些具体的状态类

状态基类

//状态模式模型,状态基类

public abstract class CState : IState

{ public abstract void DoWork();

public abstract int ChangeValue(int val); }

状态类型

//状态A public class CStateA:CState { public override void DoWork() { Console.WriteLine("状态A,正常数值"); } public override int ChangeValue(int val) { return val; } } //状态B public class CStateB:CState { public override void DoWork() { Console.WriteLine("状态B,双倍数值"); } public override int ChangeValue(int val) { return val*2; } } //状态C public class CStateC:CState { public override void DoWork() { Console.WriteLine("状态C,一半数值"); } public override int ChangeValue(int val) { return val/2; } }

接下来,我们创建用于测试的组件类CComponent.

//组件类 public class CComponent { private IState myState; private int myValue; //构造函数,默认状态A public CComponent(int val) { myValue = val; myState = new CStateA(); } //属性,状态 public IState State { get { return myState; } set { myState = value; } } //属性,值 public int Value { get { return myState.ChangeValue(myValue); } set { myValue = value; } } //方法 public void DoWork() { myState.DoWork(); } }

最后我们用代码测试这个类型

//应用测试 class Program { static void Main(string[] args) { //初始化状态,状态A CComponent component = new CComponent(100); component.DoWork(); Console.WriteLine("component.Value={0}",component.Value); Console.WriteLine(); //状态B component.State = new CStateB(); component.DoWork(); Console.WriteLine("component.Value={0}", component.Value); Console.WriteLine(); //状态C component.State = new CStateC(); component.DoWork(); Console.WriteLine("component.Value={0}", component.Value); Console.WriteLine(); Console.Read(); } }代码运行结果如下:

QQ图片20130907131815
 

 

应用特点

使用状态模式时应注意以下几个问题:

  • 状态模式一般用于当一个组件有很多的”状态”,而在不同的状态下会影响组件的属性值或行为时.如果不使用状态模式,我们需要在这些属性或行为方法中使用选择语句去判断不同状态时的行为,代码的扩展\维护都会随着时间的推移而越来越复杂.然而,我们通过使用状态模式将”状态”从组件中解耦,就可以最大限度地保证原有组件代码的稳定,当状态改变时,只要修改状态类就可以了,无须修改组件中的属性或行为方法.
  • 不同的状态将在组件内部改变它的行为和特性
  • 如果有新的状态产生,只需要添加一个状态类即可
  • 优点,将不同的状态行为\特性与组件对象解耦,增强了代码结构的弹性,方便了代码的维护工作.
  • 缺点,会产生一系列额外的状态类型.
posted @ 2013-09-09 08:19  幕三少  阅读(292)  评论(0编辑  收藏  举报