• 设计模式14——行为型模式之职责链模式


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

    类型:行为型模式。

    概述:

             职责链模式,行为型模式,说明其主要是通过行为来表现的。这里的行为,也可以理解为方法(Method)。职责链模式,将一堆处理事件的行为对象抽象为一个个的类。有些类似链表结构,每个类中都有一个指针,指向它的下一个类。这样,当一个类处理完它要处理的事情之后,就将工作将给下一个类来处理。如果下一个类发现它暂时无事可做,它依然将职责转到下一个类去处理。

             职责链模式,好将每一个职责抽象成一个类。然后处理某件事,会有一系列的职责者,这样就抽象出一系列的职责。然后用指针,像链表一样,将它们链起来,就形成了职责链模式了。

              一系列的职责,抽象出相同的接口,以及一个指针形成抽象类作为这一系列职责类的抽象基类。

             例如,生产线的工人。每个人,针对生产产品的职责,去完成自己的职责,完成之后,就可以交给生产线上的下一位员工。有些生产线,对员工职责的顺序有要求,有些生产线没有要求。

    类图:


     

    参与者:

    1. Client,发起职责。
    2. Worker,抽象基类,提供所有其他具体工人工作的接口,另外有一个指针,指向Worker类的变量。
    3. InstallerPackerQC,生产线上的三种工人,分别实现自己要做的工作,另外指向它的下一个职责者,如果没有,则不用指出。

    示例代码:

    [csharp] view plaincopy在CODE上查看代码片派生到我的代码片
    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.Text;  
    4.   
    5. namespace Design14  
    6. {  
    7.     // 抽象接口  
    8.     abstract class Worker  
    9.     {  
    10.         public Worker worker;  
    11.   
    12.         public abstract void DoHandler();  
    13.     }  
    14.   
    15.     class Installer : Worker  
    16.     {  
    17.         public Installer(Worker _worker)  
    18.         {  
    19.             this.worker = _worker;  
    20.         }  
    21.   
    22.         public override void DoHandler()  
    23.         {  
    24.             Console.WriteLine("完成产品的基本组装");  
    25.   
    26.             if (null != this.worker)  
    27.             {  
    28.                 this.worker.DoHandler();  
    29.             }  
    30.         }  
    31.     }  
    32.   
    33.     class Packer : Worker  
    34.     {  
    35.         public Packer(Worker _worker)  
    36.         {  
    37.             this.worker = _worker;  
    38.         }  
    39.   
    40.         public override void DoHandler()  
    41.         {  
    42.             Console.WriteLine("完成产品的打包");  
    43.   
    44.             if (null != this.worker)  
    45.             {  
    46.                 this.worker.DoHandler();  
    47.             }  
    48.         }  
    49.     }  
    50.   
    51.     class QC : Worker  
    52.     {  
    53.         public QC(Worker _worker)  
    54.         {  
    55.             this.worker = _worker;  
    56.         }  
    57.   
    58.         public override void DoHandler()  
    59.         {  
    60.             Console.WriteLine("完成产品的质检");  
    61.   
    62.             if (null != this.worker)  
    63.             {  
    64.                 this.worker.DoHandler();  
    65.             }  
    66.         }  
    67.     }  
    68.   
    69.     // Client  
    70.     class Program  
    71.     {  
    72.         static void Main(string[] args)  
    73.         {  
    74.             // 完成职责链的构建  
    75.             Worker qc = new QC(null);  
    76.             Worker packer = new Packer(qc);  
    77.             Worker installer = new Installer(packer);  
    78.   
    79.             // 开户执行职责  
    80.             installer.DoHandler();  
    81.         }  
    82.     }  
    83. }  

    适用性:

    1. 对于同一请求,有多个不同的处理方式。
    1. 有多个请求,不知道哪一个请求正确。

    注意:

    1. 如果是C++,抽象类一定要注意析构函数一定要是虚函数。
    2. 职责链并不一定要求是一条链条,也可以是像树一样.

    优缺点:

    1. 优点,降低了请求者与响应者之间的耦合度。增强了职责的灵活性,可以不同职责组合。
    2. 缺点,当职责链比较多时,对于链的正确配置容易遗漏。

    参考资料:

    1. 《设计模式——可复用面向对象软件基础》
    2. 《大话设计模式》
    3. 《Head First设计模式》
  • 相关阅读:
    Hibernate缓存机制
    如何建立索引
    数据库索引及基本优化入门
    索引优化-2
    索引优化-1
    Linux基本命令参数
    Spring 依赖注入(控制反转)介绍
    Linux的软连接和硬连接
    聚簇索引(Clustered Index)和非聚簇索引 (Non- Clustered Index)
    常见和链表相关的算法
  • 原文地址:https://www.cnblogs.com/feihe0755/p/3529451.html
Copyright © 2020-2023  润新知