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

目录
  • 一、动机(Motivate)
  • 二、意图(Intent)
  • 三、结构图(Structure)
  • 四、模式的组成
  • 五、职责链模式的代码实现
  • 六、职责链模式的实现要点:
    • 1、职责链模式的主要优点有:
    • 2、职责链模式的主要缺点有:
    • 3、在下面的情况下可以考虑使用职责链模式:
  • 七、.NET 职责链模式的实现

一、动机(Motivate)

在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合。如何使请求的发送者不需要指定具体的接受者,让请求的接受者自己在运行时决定来处理请求,从而使两者解耦。

二、意图(Intent)

避免请求发送者与接收者耦合在一起,让多个对象都有可能接受请求,将这些对象连接成一条链,并且沿着这条链传递请求,知道有对象处理它为止。                                 ——《设计模式》GoF

三、结构图(Structure)

四、模式的组成

可以看出,在职责链模式的结构图有以下角色:
(1)、抽象处理者角色(Handler):抽象处理者定义了一个处理请求的接口,它一般设计为抽象类,由于不同的具体处理者处理请求的方式不同,因此在其中定义了抽象请求处理方法。因为每一个处理者的下家还是一个处理者,因此在抽象处理者中定义了一个自类型的对象,作为其对下家的引用。通过该引用,处理者可以连成一条链。
(2)、具体处理者角色(ConcreteHandler):具体处理者是抽象处理者的子类,它可以处理用户请求,在具体处理者类中实现了抽象处理者中定义的抽象处理方法,在处理请求之前需要进行判断,看是否有相应的处理权限,如果可以处理请求就处理它,否则将请求转发给后继者;在具体处理者中可以访问链中下一个对象,以便请求的转发。

五、职责链模式的代码实现

在现实生活中,职责链模式的例子也是很多的,例如:公司的请假流程就是一个很好的职责链模式的例子,如果请假半天,只要告诉本部门经理就可以了;如果请假7天或者以上必须人事总监批准;如果请假15天以上,那就要经过总裁批准了。还有类似的例子就是采购的流程,其流程也是职责链模式很好的体现,采购的金额不同,需要批准的人员也不同,比如:部门采购1万元的纸品,只要部门领导签批就可以,如果要采购大于1万小于5万的物品,那就需要财务经理签批了,如果采购30万的原材料或者物品,那就需要总裁或者类似角色才能审批了。接下来我们就以采购的实例来说明职责链模式。实现代码如下:

static void Main(string[] args)
{
    PurchaseRequest requestDao = new PurchaseRequest(8000.0, "单刀5把");
    PurchaseRequest requestHuaJi = new PurchaseRequest(10000.0, "10把方天画戟");
    PurchaseRequest requestJian = new PurchaseRequest(80000.0, "5把金丝龙鳞闪电劈");

    Approver manager = new Manager("黄飞鸿");
    Approver financial = new FinancialManager("黄麒英");
    Approver ceo = new CEO("十三姨");

    // 设置职责链
    manager.NextApprover = financial;
    financial.NextApprover = ceo;

    // 处理请求
    manager.ProcessRequest(requestDao);
    manager.ProcessRequest(requestHuaJi);
    manager.ProcessRequest(requestJian);

}
// 采购请求
public sealed class PurchaseRequest
{
    // 金额
    public double Amount { get; set; }

    // 产品名字
    public string ProductName { get; set; }

    public PurchaseRequest(double amount, string productName)
    {
        Amount = amount;
        ProductName = productName;
    }
}

//抽象审批人,Handler---相当于“抽象处理者角色”
public abstract class Approver
{
    //下一位审批人,由此形成一条链
    public Approver NextApprover { get; set; }

    //审批人的名称
    public string Name { get; set; }

    public Approver(string name)
    {
        this.Name = name;
    }

    //处理请求
    public abstract void ProcessRequest(PurchaseRequest request);
}

//部门经理----相当于“具体处理者角色” ConcreteHandler
public sealed class Manager : Approver
{
    public Manager(string name) : base(name) { }

    public override void ProcessRequest(PurchaseRequest request)
    {
        if (request.Amount <= 10000.0)
        {
            Console.WriteLine("{0} 部门经理批准了对原材料{1}的采购计划!", this.Name, request.ProductName);
        }
        else if (NextApprover != null)
        {
            NextApprover.ProcessRequest(request);
        }
    }
}

//财务经理---相当于“具体处理者角色”ConcreteHandler
public sealed class FinancialManager : Approver
{
    public FinancialManager(string name) : base(name) { }

    public override void ProcessRequest(PurchaseRequest request)
    {
        if (request.Amount > 10000.0 && request.Amount <= 50000.0)
        {
            Console.WriteLine("{0} 财务经理批准了对原材料{1}的采购计划!", this.Name, request.ProductName);
        }
        else if (NextApprover != null)
        {
            NextApprover.ProcessRequest(request);
        }
    }
}

//总裁---相当于“具体处理者角色” ConcreteHandler
public sealed class CEO : Approver
{
    public CEO(string name) : base(name) { }

    public override void ProcessRequest(PurchaseRequest request)
    {
        if (request.Amount > 50000.0 && request.Amount < 300000.0)
        {
            Console.WriteLine("{0} 总裁批准了对原材料 {1} 的采购计划!", this.Name, request.ProductName);
        }
        else
        {
            Console.WriteLine("这个采购计划的金额比较大,需要一次董事会会议讨论才能决定!");
        }
    }
}

六、职责链模式的实现要点:

Chain of Responsibility模式的应用场合在于“一个请求可能有多个接受者,但是最后真正的接受者只有一个”,只有这时候请求发送者与接受者的耦合才有可能出现“变化脆弱”的症状,职责链的目的就是将二者解耦,从而更好地应对变化。
应用了Chain of Responsibility模式后,对象的职责分派将更具灵活性。我们可以在运行时动态添加/修改请求的处理职责。
当我们要新增一个DHandler处理请求,就不需再改原来的代码了,遵从了开放封闭原则。这样我们的程序就更赋予变化,更有变化的抵抗力。Handler类本身继承自BaseHandler类型,又包含了一个BaseHandler类型的对象,这点类似Decorator模式。
如果请求传递到职责链的末尾仍得不到处理,应该有一个合理的缺省机制。这也是每一个接受对象的责任,而不是发出请求的对象的责任。

1、职责链模式的主要优点有:

1】、降低耦合度:职责链模式使得一个对象无需知道是其他哪一个对象处理其请求。对象仅需知道该请求会被处理即可,接受者和发送者都没有对方的明确信息,且链中的对象不需要知道链的结构,有客户端负责链的创建。
2】、可简化对象的相互连接:接受者对象仅需维持一个指向其后继者的引用,而不需维持它对所有的候选处理者的引用。
3】、增强给对象指派职责的灵活性:在给对象分派职责时,职责链可以给我们带来更多的灵活性。可以通过在运行时对该连进行动态的增加或修改处理一个请求的职责。
4】、增加新的请求处理类很方便:在系统中增加一个新的请求处理者无需修改原有系统的代码,只需要在客户端重新建链即可,从这一点看来是符合“开闭原则”的。

2、职责链模式的主要缺点有:

1】、在找到正确的处理对象之前,所有的条件判定都要执行一遍,当责任链过长时,可能会引起性能的问题。
2】、可能导致某个请求不被处理。
3】、客户端需要组装这个链条,耦合了客户端和链条的组成结构,可以把这个在客户端的组合动作提到外面,通过配置来做,会更好点。

3、在下面的情况下可以考虑使用职责链模式:

1】、一个系统的审批需要多个对象才能完成处理的情况下,例如请假系统等。
2】、代码中存在多个if-else语句的情况下,此时可以考虑使用责任链模式来对代码进行重构
3】、有多个对象可以处理同一个请求,具体哪个对象处理该请求有运行时刻自动确定。客户端只需将请求提交到链上,无须关心请求的处理对象是谁以及它是如何处理的。
4】、不明确指定接受者的情况下,向多个对象中的一个提交一个请求。请求的发送者与请求者解耦,请求将沿着链进行传递,寻求响应的处理者。
5】、可动态指定一组对象处理请求。客户端可以动态创建职责链来处理请求,还可以动态改变链中处理者之间的先后次序

七、.NET 职责链模式的实现

这个模式在Net框架中的实现不多,我感觉这个模式的使用场景更多的是在业务系统总才会有更大的用处。这种模式在处理UI的消息时很常用,但实际上Windows消息循环还是硬编码的结构。因为效率上的考虑,Windows消息循环是哪个对象有一个请求,则直接到达处理函数的地址。如果链条上的对象多了,而真正处理的函数在链条后部分,效率会很低下。因此我们在使用这种模式的时候更适合业务流程,即对性能要求不是特别高的情况更加常用。

到此这篇关于.Net行为型设计模式之职责链模式(Chain of Responsibility)的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • .Net行为型设计模式之策略模式(Stragety)

    目录 一.动机(Motivate) 二.意图(Intent) 三.结构图(Structure) 四.模式的组成 五.策略模式的代码实现 六.策略模式的实现要点: 1.策略模式的主要优点有: 2.策略模式的主要缺点有: 3.在下面的情况下可以考虑使用策略模式: 七..NET 策略模式的实现 一.动机(Motivate) 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂:而且有时候支持不使用的算法也是一个性能负担.如何在运行时根据需要透

  • .Net行为型设计模式之中介者模式(Mediator)

    目录 一.动机(Motivate) 二.意图(Intent) 三.结构图(Structure) 四.模式的组成 五.中介者模式的代码实现 六.中介者模式的实现要点: 1.中介者模式的优点 2.中介者模式的缺点 七..NET 中介者模式的实现 一.动机(Motivate) 为什么要使用中介者模式呢?如果不使用中介者模式的话,各个同事对象将会相互进行引用,如果每个对象都与多个对象进行交互时,将会形成如下图所示的网状结构. 从上图可以发现,如果不使用中介者模式的话,每个对象之间过度耦合,这样的既不利于

  • .Net行为型设计模式之命令模式(Command)

    目录 一.动机(Motivate) 二.意图(Intent) 三.结构图(Structure) 四.模式的组成 五.命令模式的代码实现 六.命令模式的实现要点: 1.命令模式的优点: 2.命令模式的缺点: 3.命令模式的使用场景: 七..NET 中命令模式的实现 一.动机(Motivate) 在我们的现实生活中有很多例子可以拿来说明这个模式,我们还拿吃饺子这个事情来说.我的奶奶说了,今天想吃饺子,发出了命令,然后我奶奶就去看电视去了.我们夫妻俩收到命令就开始和面,做饺子馅,包饺子.饺子包好了,我

  • .Net行为型设计模式之模板方法模式(Template Method)

    一.动机(Motivate) “模板方法”,就是有一个方法包含了一个模板,这个模板是一个算法.在我们的现实生活中有很多例子可以拿来说明这个模式,就拿吃饺子这个事情来说,要想吃到饺子必须经过三步,第一步是“和面”,第二步是“包馅”,第三步是“煮饺子”,这三步就是一个算法,我们要想吃到不同的面和馅的饺子,对这三步中的任意一步就行操作就可以,也可以完全定义这三步 在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)

  • .Net行为型设计模式之迭代器模式(Iterator)

    目录 一.动机(Motivate) 二.意图(Intent) 三.结构图 四.模式的组成 五.迭代器模式的代码实现 六.迭代器模式的实现要点: 迭代器模式的优点: 迭代器模式的缺点: 迭代器模式的使用场景: 七..NET 中迭代器模式的实现 一.动机(Motivate) 在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素:同时这种“透明遍历”也为“同一种算法在多种集合对象上进行操作”提供了可能.使用面向

  • .Net行为型设计模式之观察者模式(Observer)

    目录 一.动机(Motivate) 二.意图(Intent) 三.结构图 四.模式的组成 五.观察者模式的代码实现 六.观察者模式的实现要点: 1.观察者模式的优点: 2.观察者模式的缺点: 七..NET 中观察者模式的实现 一.动机(Motivate) “观察者模式”在现实生活中,实例其实是很多的,比如:八九十年代我们订阅的报纸,我们会定期收到报纸,因为我们订阅了.银行可以给储户发手机短信,也是“观察者模式”很好的使用的例子,因为我们订阅了银行的短信业务,当我们账户余额发生变化就会收到通知等.

  • .Net行为型设计模式之状态模式(State)

    目录 一.动机(Motivate) 二.意图(Intent) 三.结构图(Structure) 四.模式的组成 五.状态模式的代码实现 六.状态模式的实现要点: 1.状态模式的优点 2.状态模式的缺点 3.在以下情况下可以使用状态模式: 七..NET 状态模式的实现 一.动机(Motivate) 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同.如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操

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

    目录 一.动机(Motivate) 二.意图(Intent) 三.结构图(Structure) 四.模式的组成 五.职责链模式的代码实现 六.职责链模式的实现要点: 1.职责链模式的主要优点有: 2.职责链模式的主要缺点有: 3.在下面的情况下可以考虑使用职责链模式: 七..NET 职责链模式的实现 一.动机(Motivate) 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合.如何使请求的发送者不需要指

  • Python设计模式之职责链模式原理与用法实例分析

    本文实例讲述了Python设计模式之职责链模式原理与用法.分享给大家供大家参考,具体如下: 职责链模式(Chain Of Responsibility):使多个对象都有机会处理请求,从而避免发送者和接收者的耦合关系.将对象连成链并沿着这条链传递请求直到被处理 下面是一个设计模式的demo: #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'Andy' """ 大话设计模式 设计模式--职责链模式 职责链模式(

  • php设计模式之职责链模式实例分析【星际争霸游戏案例】

    本文实例讲述了php设计模式之职责链模式.分享给大家供大家参考,具体如下: 星际的兵种属性随着对平衡性的调节,会进行修改.如果这样的话,我们就要考虑减少一个事件和具体处理的关联性. 比如一颗原子弹投下的瞬间,在杀伤范围内的部队或者建筑都会减少血,但是随着距离中心点的远近,受损程度是不同的,而且不同的兵种和建筑受损情况是不同的. 待解决的问题:原子弹投下的瞬间,将杀伤的处理分别交给杀伤范围内的部队或者建筑自己的方法处理. 思路:建立一个接口,让所有的部队或者建筑实现. 职责链模式(Chain of

  • php设计模式之职责链模式定义与用法经典示例

    本文实例讲述了php设计模式之职责链模式定义与用法.分享给大家供大家参考,具体如下: <?php /** * @desc php设计模式之职责链模式(责任链模式) 定义:顾名思义,责任链模式为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式. 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. * 模拟公司请假流程,实现职责链模式 * 项目主管:

  • 快速学习C# 设计模式之职责链模式

    职责链模式简介及UML 职责链也叫责任链,他是一种行为型模式,它为请求创建了一个接收请求者对象的链,并将请求沿着这条链传递到目标对象去处理. 该模式最简单的实现方式就是运用里氏替换原则,对每个职责所持有的对象进行抽象,并使得每个职责对象都拥有共同的父类,通过对外提供出具有一般意义的接口. 范例 该范例,是我在对微服务中,服务发现的容错性进行处理的一种处理方案,考虑到服务发现过程中,如果注册中心宕机,那么可以使用本地文件存放的临时性信息,如果本地文件不存在,那么就直接用内容中存放的信息.在整个流程

  • JavaScript设计模式之职责链模式

    概述 职责链模式是设计模式中行为型的一种设计模式: 定义:使多个对象都有机会处理请求,从而避免请求的发送者与接收者之间的耦合关系,将这些处理请求的对象形成一个链,并沿着这个链传递请求,直到有一个对象处理它为止: 白话解释:作者坐标武汉,1000+万人口的新一线城市 :以早高峰公交为例,早上早高峰的时候通常都是公交车前门拥堵,以至于没办法刷卡乘车:但是后门相对来说会空一些,这时我们选择后门上车,但是我们后门上车就刷不了卡:逃单?不存在的,这可不是我们作为讲文明.有素质的新一代青年应该做的:于是,我

  • JavaScript设计模式之职责链模式应用示例

    本文实例讲述了JavaScript设计模式之职责链模式.分享给大家供大家参考,具体如下: 一.职责链的定义: 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 二.实例场景说明: 某公司对公司产品-手机进行促销活动,有以下政策:在正式购买时,已经支付过500元定金的用户会收到100元的商城优惠卷,交200元定金的用户可以收到50元的优惠卷,而之前没有支付定金的用户只能进入普通购买模式,也就是没有优惠卷

  • C#设计模式之职责链模式示例详解

    前言 在软件开发中,我们通常会遇到一种场景,比如某个请求,会依次经过系统中的很多个模块来处理,如果某个模块处理不了,则将请求传递给下一个模块,比如在订单处理中,首先要经过用户校验,商品库存充足校验,如果不满足条件,返回错误,如果满足条件才会到下一步处理. 在ASP.NET Core里有middleware中间键的概念,每一个请求进来,都会经过一系列的Handler,这是一种职责链模式,每一个Handler都会决定是否处理该请求,以及是否决定将该请求传递给一下请求继续处理. 在.NET的委托中,也

  • Java设计模式之职责链模式详解

    目录 前言 一.职责链模式的定义与特点 二.职责链模式的结构 三.职责链模式案例 前言 本文简单介绍了设计模式的一种--职责链模式  一.职责链模式的定义与特点 定义: 为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链:当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止. 比如我们的审批制度,低等级的审批不了的,交给上一级审批,依次类推,直到审批结束. 在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处

  • JavaScript设计模式之职责链模式详解

    目录 职责链模式 1. 现实中的职责链模式 2. 实际开发中的职责链模式 3. 用职责链模式重构代码 4. 灵活可拆分的职责链节点 5. 异步的职责链 6. 职责链模式的优缺点 7. 用 AOP 实现职责链 8. 小结 职责链模式 职责链模式的定义是:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 职责链模式的名字非常形象,一系列可能会处理请求的对象被连接成一条链,请求在这些对象之间依次传递,直到遇

随机推荐