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

  • 相关阅读:
    解决.net core 3.1 json日期带T的问题
    C# 将指定得时间转换成秒
    WPF Button按钮的按下和抬起分别触发的事件
    WPF Image图片后台绑定图片,不对图片照成占用
    WPF Textbox漂亮的文本控件框封装
    WPF Slider实现可拖动的时间轴
    .net mvc 下显示PDF文件
    .net core 3.1使用命令自动生成MySQL表对应的实体类
    .net core A generic error occurred in GD 已解决
    WPF 模拟Button按钮事件触发
  • 原文地址:https://www.cnblogs.com/virus1102/p/5366498.html
Copyright © 2011-2022 走看看