跟着老侯玩编程 跟着老侯玩编程
首页
  • 基础语法
  • 设计模式
  • 基础语法
  • 课程目录
  • 码农宝典
网盘 (opens new window)
留言
首页
  • 基础语法
  • 设计模式
  • 基础语法
  • 课程目录
  • 码农宝典
网盘 (opens new window)
留言
  • 基础语法

    • 单元文件
    • 变量和常量
    • 内联变量
    • 基本数据类型
    • 复合数据类型
    • 语句(选择语句)
    • 语句(循环语句)
    • 数组
    • 初识例程
    • 初识面向对象
    • 属性Property
    • 面向对象的方法
    • 指针
    • 接口
    • 匿名函数和委托实现
    • 多态
    • 字符串详解
    • 异常处理
    • 反射机制
    • 泛型容器
    • JSON
    • 文件操作
    • Dll创建并调用
    • DLL初始化和退出处理
    • Package
    • 理解消息循环
    • VCL与Windows消息
    • 钩子原理
    • 进程通讯-内存映像
    • 多线程开篇
    • 线程控制
    • 线程同步
  • 设计模式

    • 单例模式
    • 单例模式二
    • 策略模式
    • 简单工厂模式
    • 建造者模式
    • 原型模式
    • 模板方法模式
    • 状态模式
    • 迭代器模式
    • 解释器模式
    • 责任链模式
      • 代码实现
    • 中介者模式
    • 备忘录模式
    • 命令模式
    • 观察者模式
    • 访问者模式
    • 适配器模式
    • 桥接模式
  • Delphi
  • 设计模式
舞动的代码
2022-04-29

责任链模式

定义:责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

引自:菜鸟教程

从上面的话中我们可以得出两个结论。首先责任链模式让请求者无感,它只需要担心结果即可。其次针对一个请求的处理是由一条链来组成的,这个链上的每个节点都明确的具有自己的权限范围,当无法处理时将请求传递给下一个节点。如果还是不太理解请看下图,一图胜千言

我忘了这种图叫什么图了,也不知道用的图形是否正确,但是责任链模式的含义大致如此

# 代码实现

代码编写最核心的是接口的设计,需要将处理请求的功能形成一个链,主要由两部分组成

  • 定义一个处理请求的接口。
  • 实现后继链。

大致类图如下

program ChainOfResponsibility;

{$APPTYPE CONSOLE}
{$R *.res}

uses
    System.SysUtils;

type
    THandle = class abstract
    private

        FNextHandle: THandle;

    public
        property NextHandle: THandle read FNextHandle write FNextHandle;

        procedure RequestHandle(Request: Integer); virtual; abstract;
    end;

    TLeader = class(THandle)

    public
        procedure RequestHandle(Request: Integer); override;
    end;

    TManager = class(THandle)
        procedure RequestHandle(Request: Integer); override;
    end;

    { TLeader }

procedure TLeader.RequestHandle(Request: Integer);
begin
    if (Request >= 1) and (Request <= 3) then Writeln('组长审批通过')

    else NextHandle.RequestHandle(Request) // 当前领导无法处理,交由上级
end;

{ TManager }

procedure TManager.RequestHandle(Request: Integer);
begin
    if (Request >= 4) and (Request <= 10) then Writeln('项目经理审批通过')

    else NextHandle.RequestHandle(Request)
end;

begin
    try
        // 组装链
        var
        Manager := TManager.Create();

        var
        Leader := TLeader.Create();

        Leader.NextHandle := Manager;

        // 发起请求
        Leader.RequestHandle(10);

    except
        on E: Exception do Writeln(E.ClassName, ': ', E.Message);
    end;

    Readln;

end.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
上次更新: 2022/05/05, 14:24:28
解释器模式
中介者模式

← 解释器模式 中介者模式→

Theme by Vdoing | Copyright © 2013-2022 冀ICP备16006233号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×