zoukankan      html  css  js  c++  java
  • GoF——职责链模式

    职责链模式(chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

    结构图:

    UML

    职责链的好处

      关键:当客户提交一个请求时,请求是沿着链传递直至有一个ConcreteHandler对象处理它为止

      使得接收者和发送者都没有对方的明确信息,且链中的对象自己也不知道链的结构,结构式职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选接收者者的引用。大大降低了耦合度。

      必须要全面考虑,因为一个请求有可能到了链的末尾也得不到处理,或者因为没有正确配置而没有得到处理。

    代码示例:

      

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Text;
     4 
     5 namespace 职责链模式
     6 {
     7     class Program
     8     {
     9         static void Main(string[] args)
    10         {
    11             Handler h1 = new ConcreteHandler1();
    12             Handler h2 = new ConcreteHandler2();
    13             Handler h3 = new ConcreteHandler3();
    14             h1.SetSuccessor(h2);
    15             h2.SetSuccessor(h3);
    16 
    17             int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };
    18 
    19             foreach (int request in requests)
    20             {
    21                 h1.HandleRequest(request);
    22             }
    23 
    24             Console.Read();
    25 
    26         }
    27     }
    28 
    29     abstract class Handler
    30     {
    31         protected Handler successor;
    32 
    33         public void SetSuccessor(Handler successor)
    34         {
    35             this.successor = successor;
    36         }
    37 
    38         public abstract void HandleRequest(int request);
    39     }
    40 
    41     class ConcreteHandler1 : Handler
    42     {
    43         public override void HandleRequest(int request)
    44         {
    45             if (request >= 0 && request < 10)
    46             {
    47                 Console.WriteLine("{0}  处理请求  {1}",
    48                   this.GetType().Name, request);
    49             }
    50             else if (successor != null)
    51             {
    52                 successor.HandleRequest(request);
    53             }
    54         }
    55     }
    56 
    57     class ConcreteHandler2 : Handler
    58     {
    59         public override void HandleRequest(int request)
    60         {
    61             if (request >= 10 && request < 20)
    62             {
    63                 Console.WriteLine("{0}  处理请求  {1}",
    64                   this.GetType().Name, request);
    65             }
    66             else if (successor != null)
    67             {
    68                 successor.HandleRequest(request);
    69             }
    70         }
    71     }
    72 
    73     class ConcreteHandler3 : Handler
    74     {
    75         public override void HandleRequest(int request)
    76         {
    77             if (request >= 20 && request < 30)
    78             {
    79                 Console.WriteLine("{0}  处理请求  {1}",
    80                   this.GetType().Name, request);
    81             }
    82             else if (successor != null)
    83             {
    84                 successor.HandleRequest(request);
    85             }
    86         }
    87     }
    88 
    89 }
    View Code

    2016-04-08

  • 相关阅读:
    [Go] 实现websocket服务端
    [PHP] php使用event扩展的io复用测试
    [MySQL] 使用force index强制使用索引
    [Go] 使用net包作为tcp客户端读取http
    [Go] golang中的包管理
    [Go] 解决golang.org模块无法下载的问题
    [日常] linux设置环境变量
    [Go] golang定时器与redis结合
    [Go] golang定时器的使用
    [Linux] linux路由表
  • 原文地址:https://www.cnblogs.com/virus1102/p/5366498.html
Copyright © 2011-2022 走看看