定义此种模式允许当内部状态改变时类也改变其行为,好像改变了类结构一般。
使用频度:
![]()
中
UML 类图![]()
参与者该模式参与的类或对象
- 维护定义了当前状态的ConcreteState子类的实例
- ConcreteState(具体状态,如红卡,银卡,绿卡)
C# 示例代码 // State pattern -- Structural example
using System;
namespace DoFactory.GangOfFour.State.Structural
{
///
/// MainApp startup class for Structural
/// State Design Pattern.
///
class MainApp
{
///
/// Entry point into console application.
///
static void Main()
{
// Setup context in a state
Context c = new Context(new ConcreteStateA());
// Issue requests, which toggles state
c.Request();
c.Request();
c.Request();
c.Request();
// Wait for user
Console.ReadKey();
}
}
///
/// The 'State' abstract class
///
abstract class State
{
public abstract void Handle(Context context);
}
///
/// A 'ConcreteState' class
///
class ConcreteStateA : State
{
public override void Handle(Context context)
{
context.State = new ConcreteStateB();
}
}
///
/// A 'ConcreteState' class
///
class ConcreteStateB : State
{
public override void Handle(Context context)
{
context.State = new ConcreteStateA();
}
}
///
/// The 'Context' class
///
class Context
{
private State _state;
// Constructor
public Context(State state)
{
this.State = state;
}
// Gets or sets the state
public State State
{
get { return _state; }
set
{
_state = value;
Console.WriteLine("State: " +
_state.GetType().Name);
}
}
public void Request()
{
_state.Handle(this);
}
}
}
|
输出State: ConcreteStateA
State: ConcreteStateB
State: ConcreteStateA
State: ConcreteStateB
State: ConcreteStateA
|
阅读(640) | 评论(0) | 转发(0) |