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

全部博文(220)

文章存档

2012年(5)

2011年(38)

2010年(135)

2009年(42)

我的朋友

分类:

2009-10-17 12:45:09

定义

通过让不只一个对象处理同一请求从而避免请求发送者和接受者的一一绑定。所有接受者形成处理链,沿着处理链传递请求直到某个对象处理该请求。

使用频度: 中低



UML 类图



参与者

该模式参与的类或对象

  • Handler(处理器,如审批人)
    • 定义处理请求的接口
    • (可选)实现后继链接
  • ConcreteHandler(具体处理器,如董事,副主席,主席)
    • 处理自己负责的请求
    • 能访问其后继处理器
    • 如果该处理器能处理该请求则处理,否则传递到后继处理器
  • Client
    • 初始化传递到处理链的请求

C# 实例代码



// Chain of Responsibility pattern -- Structural example


using System;

 

namespace DoFactory.GangOfFour.Chain.Structural

{

  ///




  /// MainApp startup class for Structural


  /// Chain of Responsibility Design Pattern.


  ///



  class MainApp

  {

    ///


    /// Entry point into console application.


    ///



    static void Main()

    {

      // Setup Chain of Responsibility


      Handler h1 = new ConcreteHandler1();

      Handler h2 = new ConcreteHandler2();

      Handler h3 = new ConcreteHandler3();

      h1.SetSuccessor(h2);

      h2.SetSuccessor(h3);

 

      // Generate and process request


      int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };

 

      foreach (int request in requests)

      {

        h1.HandleRequest(request);

      }

 

      // Wait for user


      Console.ReadKey();

    }

  }

 

  ///


  /// The 'Handler' abstract class


  ///



  abstract class Handler

  {

    protected Handler successor;

 

    public void SetSuccessor(Handler successor)

    {

      this.successor = successor;

    }

 

    public abstract void HandleRequest(int request);

  }

 

  ///


  /// The 'ConcreteHandler1' class


  ///



  class ConcreteHandler1 : Handler

  {

    public override void HandleRequest(int request)

    {

      if (request >= 0 && request < 10)

      {

        Console.WriteLine("{0} handled request {1}",

          this.GetType().Name, request);

      }

      else if (successor != null)

      {

        successor.HandleRequest(request);

      }

    }

  }

 

  ///


  /// The 'ConcreteHandler2' class


  ///



  class ConcreteHandler2 : Handler

  {

    public override void HandleRequest(int request)

    {

      if (request >= 10 && request < 20)

      {

        Console.WriteLine("{0} handled request {1}",

          this.GetType().Name, request);

      }

      else if (successor != null)

      {

        successor.HandleRequest(request);

      }

    }

  }

 

  ///


  /// The 'ConcreteHandler3' class


  ///



  class ConcreteHandler3 : Handler

  {

    public override void HandleRequest(int request)

    {

      if (request >= 20 && request < 30)

      {

        Console.WriteLine("{0} handled request {1}",

          this.GetType().Name, request);

      }

      else if (successor != null)

      {

        successor.HandleRequest(request);

      }

    }

  }

}


输出:


ConcreteHandler1 handled request 2
ConcreteHandler1 handled request 5
ConcreteHandler2 handled request 14
ConcreteHandler3 handled request 22
ConcreteHandler2 handled request 18
ConcreteHandler1 handled request 3
ConcreteHandler3 handled request 27
ConcreteHandler3 handled request 20


阅读(573) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~