Chinaunix首页 | 论坛 | 博客
  • 博客访问: 666245
  • 博文数量: 220
  • 博客积分: 10487
  • 博客等级: 上将
  • 技术积分: 2072
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-09 00:25
文章分类

全部博文(220)

文章存档

2012年(5)

2011年(38)

2010年(135)

2009年(42)

我的朋友

分类:

2009-10-18 20:15:06

定义

此种模式允许当内部状态改变时类也改变其行为,好像改变了类结构一般。
 
使用频度:


UML 类图




参与者

该模式参与的类或对象

  • Context(环境,如账户)
    • 为客户端定义接口
    • 维护定义了当前状态的ConcreteState子类的实例
  • State(状态)
    • 定义封装了相关Context状态的行为的接口
  • ConcreteState(具体状态,如红卡,银卡,绿卡)
    • 实现State接口方法



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) |
给主人留下些什么吧!~~