职责链模式(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)一起使用。这种情况下,一个构件的父构件可作为它的后继。

组合模式结构图


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

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

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

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

职责链模式 Chain of Responsibility Pattern

一、什么是职责链模式     Chain of Responsibility(CoR)模式也叫职责链模式或者职责连锁模式,是行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务...
  • liuwenbo0920
  • liuwenbo0920
  • 2012年02月18日 08:52
  • 503

职责链模式(Chain of Responsibility Pattern)

一、 职责链(Chain of Responsibility)模式责任链模式是一种对象的行为模式【GOF95】。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传...
  • heshengfen123
  • heshengfen123
  • 2008年10月14日 14:51
  • 446

职责链模式(Chain Of Responsibility Pattern)

  当一个对象向多个对象发送相同的信息时,就需要一种策略来确定由哪个对象对所发送的信息进行处理,而这样的处理对象也只能有一个。使用case语句或if语句的方法会给程序的维护带来很大难度,这就需要职责链...
  • peacefulsword
  • peacefulsword
  • 2006年10月15日 11:22
  • 390

职责链模式(Chain of Responsibility Pattern)

抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。具体处理者(ConcreteHandler)...
  • diandian82
  • diandian82
  • 2007年04月23日 16:30
  • 444

设计模式介绍之八:职责链模式(Chain of responsibility)

职责链模式使得一个软件系统中的多个对象都有机会处理请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止,从而避免请求的发送者和接收者之间产生强耦合关系。     常见的应用程...
  • foruok
  • foruok
  • 2014年03月27日 08:21
  • 3624

设计模式 职责链模式(Chain of Responsibility Pattern)

Chain of Responsibility 目的 构造应用结论 目的 禁止请求发送者同多个接收者的耦合。接收者链不断传递请求直到能够解决请求。 构造 Handler : 定义一个...
  • ranran_5300
  • ranran_5300
  • 2015年12月03日 11:12
  • 184

设计模式 -- 职责链模式(Chain of Responsibility Pattern)

todo
  • Oktfolio
  • Oktfolio
  • 2018年01月09日 15:11
  • 30

[设计模式]ChainOfResponsibility责任链模式

问题 熟悉VC/MFC的都知道,vc是”基于消息,事件驱动”,消息在vc开发中起着举足轻重的作用。在MFC中,消息是通过一个向上递交的方式进行处理,例如一个WM_Command消息的查出来流程可能为...
  • ouyangshima
  • ouyangshima
  • 2013年01月10日 20:09
  • 2444

设计模式14:Chain of Responsibility Pattern (职责链模式)

Define:Avoid coupling the sender of a request to its receiver by giving more than one object a chanc...
  • rocket5725
  • rocket5725
  • 2009年07月03日 10:15
  • 1469
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:职责链模式(Chain of Responsibility Pattern)
举报原因:
原因补充:

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