Net设计模式实例之状态模式(State Pattern)(1)

一、状态模式简介(Brief Introduction

状态模式(State Pattern),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

二、解决的问题(What To Solve

状态模式主要解决的是当控制一个对象状态装换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简单化。
当一个对象行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。

三、状态模式分析(Analysis

1、状态模式结构

Net设计模式实例之状态模式(State Pattern)(1)
 
Context类:维护一个ConcreteState子类的一个实例,这个实例定义当前的状态。
State类:抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为。
ConcreteStateA,ConcreteStateB,ConcreteStateC类:具体状态类,每一个子类实现一个与Context的一个状态相关的行为。

2、源代码

1Context类:维护一个ConcreteState子类的一个实例,这个实例定义当前的状态
public class Context
{
    private State state;
 
    public State State
    {
        get { return state; }
        set
        {
            state = value;
            Console.WriteLine("当前状态是:" + state.GetType().Name);
        }
    }
    public Context(State state)
    {
        this.state = state;
        Console.WriteLine("初始状态是:"+state.GetType().Name);
    }
 
    public void Request()
    {
        state.Handle(this);
    }
}
 
2抽象状态类及其具体实现类
public abstract class State
{
   public abstract void Handle(Context context);
}
 
public class ConcreteStateA:State
{
    public override void Handle(Context context)
    {
        context.State = new ConcreteStateB();
    }
}
 
public class ConcreteStateBState
{
    public override void Handle(Context context)
    {
        context.State = new ConcreteStateC();
    }
}
public class ConcreteStateC : State
{
    public override void Handle(Context context)
    {
        context.State = new ConcreteStateA();
    }
}
 
4、客户端代码
static void Main(string[] args)
{
    Context context = new Context(new ConcreteStateA());
    context.Request();
    context.Request();
    context.Request();
    Console.Read();
}

3、程序运行结果











本文转自 灵动生活 51CTO博客,原文链接:http://blog.51cto.com/smartlife/270542,如需转载请自行联系原作者