Allow an object to alter its behavior when its internal
state changes. The object will appear to change its class.
Participants
The classes and/or objects
participating in this pattern are:
- Context (Account)
Defines the interface of interest to clients
Maintains an instance of a Concrete State subclass that
defines the current state.
- State (State)
Defines an interface for encapsulating the behavior
associated with a particular state of the Context.
- Concrete State (Red State, Silver State, Gold State)
Each subclass implements a behavior associated with a
state of Context
Example for State Design Pattern:
Example for State Design Pattern:
using System;
namespace State.Structural
{
/// <summary>
/// MainApp
startup class for Structural
/// State
Design Pattern.
/// </summary>
class MainApp
{
/// <summary>
/// Entry
point into console application.
/// </summary>
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();
}
}
/// <summary>
/// The
'State' abstract class
/// </summary>
abstract class State
{
public abstract void Handle(Context context);
}
/// <summary>
/// A
'ConcreteState' class
/// </summary>
class ConcreteStateA : State
{
public override void Handle(Context context)
{
context.State
= new ConcreteStateB();
}
}
/// <summary>
/// A
'ConcreteState' class
/// </summary>
class ConcreteStateB : State
{
public override void Handle(Context context)
{
context.State
= new ConcreteStateA();
}
}
/// <summary>
/// The
'Context' class
/// </summary>
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);
}
}
}
|
Output:
State:
ConcreteStateA
State: ConcreteStateB State: ConcreteStateA State: ConcreteStateB State: ConcreteStateA |
No comments:
Post a Comment