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

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

类型:行为型模式。

概述:

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

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

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

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

类图:

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

参与者:

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

示例代码:

using System;
using System.Collections.Generic;
using System.Text;

namespace Design14
{
    // 抽象接口
    abstract class Worker
    {
        public Worker worker;

        public abstract void DoHandler();
    }

    class Installer : Worker
    {
        public Installer(Worker _worker)
        {
            this.worker = _worker;
        }

        public override void DoHandler()
        {
            Console.WriteLine("完成产品的基本组装");

            if (null != this.worker)
            {
                this.worker.DoHandler();
            }
        }
    }

    class Packer : Worker
    {
        public Packer(Worker _worker)
        {
            this.worker = _worker;
        }

        public override void DoHandler()
        {
            Console.WriteLine("完成产品的打包");

            if (null != this.worker)
            {
                this.worker.DoHandler();
            }
        }
    }

    class QC : Worker
    {
        public QC(Worker _worker)
        {
            this.worker = _worker;
        }

        public override void DoHandler()
        {
            Console.WriteLine("完成产品的质检");

            if (null != this.worker)
            {
                this.worker.DoHandler();
            }
        }
    }

    // Client
    class Program
    {
        static void Main(string[] args)
        {
            // 完成职责链的构建
            Worker qc = new QC(null);
            Worker packer = new Packer(qc);
            Worker installer = new Installer(packer);

            // 开户执行职责
            installer.DoHandler();
        }
    }
}

适用性:

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

注意:

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

优缺点:

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

参考资料:

  1. 《设计模式——可复用面向对象软件基础》
  2. 《大话设计模式》
  3. 《Head First设计模式》

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

上一篇:Golang linux下安装与配置


下一篇:Photoshop设计打造出一朵创意的水玫瑰