设计模式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设计模式》
posted @ 2014-01-22 11:22  飞鹤0755  阅读(687)  评论(0编辑  收藏  举报