关键词:状态决定行为
对象状态的改变,从而带来行为上的变化。
意图:
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类
适用性:
• 一个对象的行为取决于它的状态 , 并且它必须在运行时刻根据状态改变它的行为。
• 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状
态通常用一个或多个枚举常量表示。通常 , 有多个操作包含这一相同的条件结构。 S t a t e模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对
象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。
案例:(瓶子打开关闭)
using System;
namespace State_DesignPattern2
{
//1
public enum StateSetting状态枚举
{
Closed,
Opened
}
//2
abstract class State
{
protected string strStatename;
abstract public void Pour();//倒水
// do something state-specific here
}
// 状态实现类 ------
class OpenedState : State
{
public OpenedState()
{
strStatename = "Opened";
}
override public void Pour()
{
Console.WriteLine("...水流出...");
}
}
class ClosedState : State
{
public ClosedState()
{
strStatename = "Closed";
}
override public void Pour()
{
Console.WriteLine("关闭状态:水没有流出!");
}
}
//3
class 瓶子_状态机
{
// If teh state classes had large amounts of instance data,
// we could dynamically create them as needed -
///if this demo// they are tiny, so we just create them as data members
//1.0
//OpenedState openedState = new OpenedState();
//ClosedState closedState = new ClosedState();
//2.0 动态创建状态对象-反射
//1:定义状态集合 2:反射技术 把每个状态放到 状态集合中
//1》要确定当前状态 并初始化
public 瓶子_状态机()
{
// Initialize to closed
CurrentState当前状态 = new ClosedState();
}
private State CurrentState当前状态;
//2》定义状态切换的方法
public void SetState修改状态(StateSetting状态枚举 newState)
{
//if (newState == StateSetting状态枚举.Closed)
//{
// CurrentState当前状态 = closedState;
//}
//else
//{
// CurrentState当前状态 = openedState;
//}
string allName = "State_DesignPattern2." + newState + "State";
Type typeObj = Type.GetType(allName);
CurrentState当前状态 = (State)Activator.CreateInstance(typeObj); ;
}
//3》调用当前状态的方法
public void Pour()
{
CurrentState当前状态.Pour();
}
}
/// <summary>
/// Summary description for Client.
/// </summary>
public class Client
{
public static void Main(string[] args)
{
瓶子_状态机 bottle = new 瓶子_状态机();
Console.WriteLine("初始状态:关闭");
bottle.Pour();
Console.WriteLine("打开瓶子:");
bottle.SetState修改状态(StateSetting状态枚举.Opened);
bottle.Pour();
bottle.SetState修改状态(StateSetting状态枚举.Closed);
bottle.Pour();
Console.ReadKey();
}
}
}