您的位置:首页 > 编程语言 > C#

C# 设计模式-状态(State)

2018-01-10 18:37 441 查看
允许一个对象在其内部状态改变时改变它的行为。

主要组成:

Context-环境,上下文,客户主要使用该类

State-状态父类或接口

ConcreteState-具体状态

相关类:

using System;

namespace State
{
/// <summary>
/// 手机(环境)
/// </summary>
class TelephoneContext
{
State telephoneState;

public TelephoneContext(State initState)
{
telephoneState = initState;
}

public void ChangeState(State state)
{
telephoneState = state;
}

public void Close()
{
telephoneState.Close(this);
}

public void Open()
{
telephoneState.Open(this);
}

public void CurrentState()
{
telephoneState.CurrentState();
}

}

/// <summary>
/// 状态父类
/// </summary>
abstract class State
{
protected string StateName;
//转换状态
public void ChangeState(TelephoneContext telephone, State state)
{
telephone.ChangeState(state);
}
//当前状态
public void CurrentState()
{
Console.WriteLine(StateName);
}
public abstract void Close(TelephoneContext telephone);
public abstract void Open(TelephoneContext telephone);
}

/// <summary>
/// 关机状态
/// </summary>
class ClosedState : State
{
static ClosedState closedState;

private ClosedState()
{
StateName = "关机状态";
}

//单件,唯一实例
public static State Instance()
{
if (closedState == null)
{
closedState = new ClosedState();
}
return closedState;
}

public override void Close(TelephoneContext telephone)
{
Console.WriteLine("已经是关机状态");
}

public override void Open(TelephoneContext telephone)
{
Console.WriteLine("开机中...");
ChangeState(telephone, OpenedState.Instance());
}
}
/// <summary>
/// 开机状态
/// </summary>
class OpenedState : State
{
static OpenedState openedState;

private OpenedState()
{
StateName = "开机状态";
}

//单件,唯一实例
public static State Instance()
{
if (openedState== null)
{
openedState=new OpenedState();
}
return openedState;
}

public override void Close(TelephoneContext telephone)
{
Console.WriteLine("关机中...");
ChangeState(telephone, ClosedState.Instance());
}

public override void Open(TelephoneContext telephone)
{
Console.WriteLine("已经是开机状态");
}
}
}


调用:

using System;

namespace State
{
class Program
{
static void Main(string[] args)
{
//初始化为关机状态
TelephoneContext telephoneContext = new TelephoneContext(ClosedState.Instance());
//当前状态
telephoneContext.CurrentState();
telephoneContext.Close();
telephoneContext.Open();

Console.WriteLine("***********");
//当前状态
telephoneContext.CurrentState();
telephoneContext.Open();
telephoneContext.Close();

Console.Read();
}
}
}


结果:



参考资料:《设计模式-可复用面对对象软件的基础》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息