首页 > 其他分享 >设计模式之责任链模式

设计模式之责任链模式

时间:2023-12-11 12:34:19浏览次数:34  
标签:__ Prototype 处理 模式 责任 对象 原型 设计模式 属性

1. 定义

请求沿着一条链传递,直到有一个对象能够处理它为止

2. 口语化表述

假设某公司的财务审批流程如下:

  • 项目经理可以审批1000元以下的费用,大于1000元的费用提交给部门经理审批
  • 部门经理可以审批10000元以下的费用,大于10000的费用提交给总经理审批
  • 总经理可以审批任何额度的费用

现在,员工报销费用时,只需要提交给自己的项目经理即可,无论数额多少,最终都会有合适的经理来处理

沿着一条链传递,这就是责任链模式

(下面的表述会沿用这个场景)

3. 源码示例

前端JavaScipt的原型链,也算是一种责任链模式

在JS中,每个对象都有一个原型对象,它可以作为对象的处理者来处理请求,如果当前对象无法处理请求,它会将请求转发给它的原型对象,直到找到一个能够处理请求的对象,如果在整个原型链上都找不到对应的属性或方法,JavaScript会返回undefined

MDN的原型链示例如下:

const o = {
  a: 1,
  b: 2,
  // __proto__ 设置了 [[Prototype]]。它在这里被指定为另一个对象字面量。
  __proto__: {
    b: 3,
    c: 4,
  },
};

// o.[[Prototype]] 具有属性 b 和 c。
// o.[[Prototype]].[[Prototype]] 是 Object.prototype(我们会在下文解释其含义)。
// 最后,o.[[Prototype]].[[Prototype]].[[Prototype]] 是 null。
// 这是原型链的末尾,值为 null,
// 根据定义,其没有 [[Prototype]]。
// 因此,完整的原型链看起来像这样:
// { a: 1, b: 2 } ---> { b: 3, c: 4 } ---> Object.prototype ---> null

console.log(o.a); // 1
// o 上有自有属性“a”吗?有,且其值为 1。

console.log(o.b); // 2
// o 上有自有属性“b”吗?有,且其值为 2。
// 原型也有“b”属性,但其没有被访问。
// 这被称为属性遮蔽(Property Shadowing)

console.log(o.c); // 4
// o 上有自有属性“c”吗?没有,检查其原型。
// o.[[Prototype]] 上有自有属性“c”吗?有,其值为 4。

console.log(o.d); // undefined
// o 上有自有属性“d”吗?没有,检查其原型。
// o.[[Prototype]] 上有自有属性“d”吗?没有,检查其原型。
// o.[[Prototype]].[[Prototype]] 是 Object.prototype 且
// 其默认没有“d”属性,检查其原型。
// o.[[Prototype]].[[Prototype]].[[Prototype]] 为 null,停止搜索,
// 未找到该属性,返回 undefined。

DOM事件处理机制可以被看作是一种责任链模式

在DOM中,事件会按照事件冒泡或者事件捕获的方式进行传递和处理,当一个元素上触发了一个事件时,事件会首先经过捕获阶段,然后再经过目标阶段,最后是冒泡阶段。在这个过程中,每个元素都有机会处理事件,如果当前元素无法处理事件,事件会被传递给其父元素,直到document对象

4. 总结

4.1 设计优点

  • 开闭原则

    无需更改现行制度,添加新的审批人只需告诉前一级经理即可

  • 单一职责原则

    每一个经理只负责自己能处理的事情

4.2 适用场景

  • 请求会被多个处理者处理时,无论是否按照一定的顺序,都可以使用责任链模式

5. 参考资料

[1] 责任链设计模式(职责链模式) (refactoringguru.cn)

[2] 继承与原型链 - JavaScript | MDN (mozilla.org)

标签:__,Prototype,处理,模式,责任,对象,原型,设计模式,属性
From: https://www.cnblogs.com/jiujiubashiyi/p/17894115.html

相关文章

  • 抽象工厂模式:角色解析与应用探索
    前言工厂模式一般指的是简单工厂模式、工厂方法模式、抽象工厂模式,这是三种工厂模式的最后一篇,其他两种的文章链接如下:设计模式之是简单工厂模式_凡夫编程的技术博客_51CTO博客工厂方法模式:改变你对软件开发的认知_凡夫编程的技术博客_51CTO博客建议三种模式放在一起对比学习,更能......
  • oracle Parallel模式-Parallel用法(/*+PARALLEL(n)*/)
    一、用途强行启用并行度来执行当前SQL。这个在Oracle9i之后的版本可以使用,之前的版本现在没有环境进行测试。也就是说,加上这个说明,可以强行启用Oracle的多线程处理功能。举例的话,就像电脑装了多核的CPU,但大多情况下都不会完全多核同时启用(2核以上的比较明显),使用parallel说明,就会......
  • 设计模式-访问者模式(主要理解“双重分派”)
    代码展示:packagecom.example.test;importjava.util.ArrayList;importjava.util.List;publicclass访问者模式{}abstractclassDepartment{abstractvoidvisit(FullTimeEmployeefullTimeEmployee);//正式工的访问abstractvoidvisit(PartTimeEmployee......
  • java 策略模式解决if-else ,函数式接口解决编写多个子类的问题
    /***@author:szc*@date:2023/9/222:45*@version:1.0*@description:从map中获取函数式接口,解决if-else多个子类问题*/@ServicepublicclassMapToInterface{@AutowiredprivateTypeResulttypeResult;privatestaticMap<String,Functio......
  • 23种设计模式——桥接模式
    今天我们继续学习23种设计模式中的桥接模式。所谓桥接模式就是将抽象部分和实现部分隔离开来,使得它们能够独立变化。桥接模式将继承关系转化成关联关系,封装了变化,完成了解耦,减少了系统中类的数量,也减少了代码量。概念:桥接模式是用于把抽象化与实现化解耦,使得二者可以独立变化。......
  • 设备驱动设计模式 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/driver-api/driver-model/design-patterns.html设备驱动设计模式这份文档描述了设备驱动中常见的设计模式。子系统维护者可能会要求驱动开发者遵循这些设计模式。状态容器container_of()1.状态容器虽然内核中包含一些设备驱动,假......
  • oracle日志模式
    oracle日志模式一、oracle日志模式分为(logging,forcelogging,nologging)默认情况是logging,就是会记录到redo日志中,forcelogging是强制记录日志,nologging是尽量减少日志。FORCELOGGING可以在数据库级别、表空间级别进行设定、而LOGGING与NOLOGGING可以在表级别设定。注:FORCELOGGIN......
  • 小谈设计模式(16)—抽象工厂模式
    (小谈设计模式(16)—抽象工厂模式)专栏介绍主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。抽象工厂模式抽象工厂模式(AbstractFactoryPattern)是一种创建型设计模式,它提供了......
  • 实验18:迭代器模式
    本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解迭代器模式的动机,掌握该模式的结构;2、能够利用迭代器模式解决实际问题。 [实验任务一]:JAVA和C++常见数据结构迭代器的使用信1305班共44名同学,每名同学都有姓名,学号和年龄等属性,分别使用JAVA内置迭代器和C++中......
  • 实验 20:备忘录模式
    本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解备忘录模式的动机,掌握该模式的结构;2、能够利用备忘录模式解决实际问题。 [实验任务一]:多次撤销改进课堂上的“用户信息操作撤销”实例,使得系统可以实现多次撤销(可以使用HashMap、ArrayList等集合数据结构实现......