职责链模式(Chain of Responsibility Pattern)

原创 2015年11月18日 22:32:23
职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
结构


对象图


参与者
Handler
——定义一个处理请求的接口。
——(可选) 实现后继链。
ConcreteHandler
——处理它所负责的请求。
——可访问它的后继者。
——如果可处理该请求,就处理之;否则将该请求转发给它的后继者。
Client
——向链上的具体处理者(ConcreteHandler)对象提交请求。
效果
1)降低耦合度
对象仅需知道该请求会被“正确”地处理。接收者和发送者都没有对方的明确的信息,且链中的对象不需知道链的结构。结果是,职责链可简化对象的相互连接。它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用。
2)增强了给对象指派职责 ( Responsibility)的灵活性 当在对象中分派职责时,职责链给你更多的灵活性。你可以通过在运行时刻对该链进行动态的增加或修改来增加或改变处理一个请求的那些职责。你可以将这种机制与静态的特例化处理对象的继承机制结合起来使用。
3)不保证被接受 既然一个请求没有明确的接收者,那么就不能保证它一定会被处理。
实现
1、实现后继者链
1)定义新的链接(通常在Handler中定义,但也可由 ConcreteHandlers 来定义);
2)使用已有的链接。
2、连接后继者 
3、表示请求 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MyChainofResponsibility
{
    abstract class Handler
    {
        protected Handler successor;

        // 设置继任者,用于构建职责链
        public void SetSuccessor(Handler successor)
        {
            this.successor = successor;
        }

        public abstract void HandleRequest(int request);
    }

    class ConcrecteHandler1 : Handler
    {
        public override void HandleRequest(int request)
        {
            if (request >= 0 && request < 10)
            {
                Console.WriteLine("{0} handle the request:{1}.",
                    this.GetType().Name, request);
            }
            else if (successor != null)
            {
                successor.HandleRequest(request); // 转给后继者处理
            }
        }
    }

    class ConcrecteHandler2 : Handler
    {
        public override void HandleRequest(int request)
        {
            if (request >= 10 && request < 20)
            {
                Console.WriteLine("{0} handle the request:{1}.",
                    this.GetType().Name, request);
            }
            else if (successor != null)
            {
                successor.HandleRequest(request); // 转给后继者处理
            }
        }
    }

    class ConcrecteHandler3 : Handler
    {
        public override void HandleRequest(int request)
        {
            if (request >= 20 && request < 30)
            {
                Console.WriteLine("{0} handle the request:{1}.",
                    this.GetType().Name, request);
            }
            else if (successor != null)
            {
                successor.HandleRequest(request); // 转给后继者处理
            }
        }
    }

}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MyChainofResponsibility
{
    class Program
    {
        static void Main(string[] args)
        {
            Handler h1 = new ConcrecteHandler1();
            Handler h2 = new ConcrecteHandler2();
            Handler h3 = new ConcrecteHandler3();
            
            // 构建职责链
            h1.SetSuccessor(h2);
            h2.SetSuccessor(h3);

            int[] requests = { 2, 14, 11, 27, 10, 3, 23 };
            foreach (int request in requests)
            {
                h1.HandleRequest(request);
            }

            Console.ReadKey();
        }
    }
}

相关模式

职责链常与组合(Composite)一起使用。这种情况下,一个构件的父构件可作为它的后继。

组合模式结构图


参考:《设计模式》、《大话设计模式》。

版权声明:本文为博主原创文章,未经博主允许不得转载。

职责链模式(Chain of Responsibility Pattern)

"围观"设计模式(22)--行为型之职责链模式(Chain Of Responsibility Pattern)

责任链模式在面向对象程式设计里是一种软件设计模式,它包含了一些命令对象和一系列的处理对象。每一个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象。该模式...

设计模式笔记18:职责链模式(Chain of Responsibility Pattern)

一、责任链模式的内容 职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链...

设计模式(行为型)之职责链模式(Chain of Responsibility Pattern)

职责链可以是一条直线、一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求。链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并让请求沿着链传递,由链上...

JAVA设计模式之 职责链模式【Chain of Responsibility Pattern】

一、概述     避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。职责链模式是一种对象行为型模式。     核心在...

Swift 06 职责链模式 Chain of Responsibility

/* 大宏药业管理层 行政总裁 卡卡: 审批3万元以下订单 经理 路飞:审批2万元以下订单 主任 白云:审批1万元以下订单 代码有错误、不能运行 */ class RequestOrder { ...

职责链模式(Chain Of Responsibility)

职责链模式(Chain Of Responsibility),使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它...
  • fly_yr
  • fly_yr
  • 2013年02月07日 19:39
  • 1056
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:职责链模式(Chain of Responsibility Pattern)
举报原因:
原因补充:

(最多只允许输入30个字)