行为型模式-状态模式
using System;
using System.Text;
using System.Collections.Generic;
namespace 状态模式
{
/*
* 状态模式意图:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。
*
* 状态模式使用场景:1、当一个对象行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时
* 2、状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简单化
*
*/
///<summary>
/// 抽象状态,定义状态公共处理方法
///</summary>
publicabstractclass State
{
publicabstractvoid Handler(Context context);
}
///<summary>
/// 上下文,维护一个状态State的具体子类
///</summary>
publicclass Context
{
private State state;
public State State
{
get { return state; }
set { state = value; }
}
public Context(State state)
{
this.state = state;
}
publicvoid Request()
{
state.Handler(this);
}
}
///<summary>
/// 状态A
///</summary>
publicclass ConcreteStateA : State
{
///<summary>
/// 在状态处理方法中设置跟换状态
///</summary>
///<param name="context"></param>
publicoverridevoid Handler(Context context)
{
context.State =new ConcreteStateB();
}
}
publicclass ConcreteStateB : State
{
publicoverridevoid Handler(Context context)
{
context.State =new ConcreteStateC();
}
}
publicclass ConcreteStateC : State
{
publicoverridevoid Handler(Context context)
{
context.State =new ConcreteStateA();
}
}
publicclass AppClient
{
publicstaticvoid Main(string[] args)
{
Context context =new Context(new ConcreteStateA());
context.Request();
context.Request();
context.Request();
}
}
}
using System.Text;
using System.Collections.Generic;
namespace 状态模式
{
/*
* 状态模式意图:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。
*
* 状态模式使用场景:1、当一个对象行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时
* 2、状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简单化
*
*/
///<summary>
/// 抽象状态,定义状态公共处理方法
///</summary>
publicabstractclass State
{
publicabstractvoid Handler(Context context);
}
///<summary>
/// 上下文,维护一个状态State的具体子类
///</summary>
publicclass Context
{
private State state;
public State State
{
get { return state; }
set { state = value; }
}
public Context(State state)
{
this.state = state;
}
publicvoid Request()
{
state.Handler(this);
}
}
///<summary>
/// 状态A
///</summary>
publicclass ConcreteStateA : State
{
///<summary>
/// 在状态处理方法中设置跟换状态
///</summary>
///<param name="context"></param>
publicoverridevoid Handler(Context context)
{
context.State =new ConcreteStateB();
}
}
publicclass ConcreteStateB : State
{
publicoverridevoid Handler(Context context)
{
context.State =new ConcreteStateC();
}
}
publicclass ConcreteStateC : State
{
publicoverridevoid Handler(Context context)
{
context.State =new ConcreteStateA();
}
}
publicclass AppClient
{
publicstaticvoid Main(string[] args)
{
Context context =new Context(new ConcreteStateA());
context.Request();
context.Request();
context.Request();
}
}
}