模式解说
责任链模式是一种对象的行为模式,它将处理客户端请求的那些对象联成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
通常使用在以下场合
1 有多个对象可以处理一个请求,哪个对象处理该请求事先并不知道,而是在运行时自动确定;
2 希望在不明确制定接收者的情况下,向多个对象中的一个提交请求;
3 处理一个请求的对象集合需要动态指定时;
16.2 结构和用法
1.抽象处理者(THandler)-定义了一个处理请求的接口。如果需要,则声明一个方法,实现对后续对象的链接;
2.具体处理者(TConcreteHandler)-负责处理求;链接后续对象,如果它能处理该请求,则处理,如果不能,则传递给其链接对象处理;
3.客户端(TClient)-发出请求给责任链中的具体处理对象; 代码示例:
unit Chain; interface type THandler = class
private
FSuccessor: THandler;
procedure SetSuccessor(const Value: THandler);
public
procedure HandleRequest; virtual; abstract;
property Successor: THandler read FSuccessor write SetSuccessor;
end; TConcreteHandler1 = class(THandler)
public
procedure HandleRequest; override;
end; TConcreteHandler2 = class(THandler)
public
procedure HandleRequest; override;
end; implementation
uses Dialogs; { Thandler } procedure THandler.SetSuccessor(const Value: THandler);
begin
FSuccessor := Value;
end; { TConcreteHandler2 } procedure TConcreteHandler2.HandleRequest;
begin
inherited;
if Successor <> nil then
begin
ShowMessage(self.ClassName + '将请求传递到 ' + Successor.ClassName);
Successor.HandleRequest;
end
else
begin
ShowMessage(self.ClassName + ' 处理了请求!');
end;
end; { TConcreteHandler1 } procedure TConcreteHandler1.HandleRequest;
begin
inherited;
if Successor <> nil then
begin
ShowMessage(self.ClassName + '将请求传递到 ' + Successor.ClassName);
Successor.HandleRequest;
end
else
begin
ShowMessage(self.ClassName + ' 处理了请求!');
end;
end; end. 客户端代码 unit Main; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; type
TForm1 = class(TForm)
OtherDone: TButton;
SelfDone: TButton;
procedure OtherDoneClick(Sender: TObject);
procedure SelfDoneClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1; implementation uses Chain; {$R *.dfm} procedure TForm1.OtherDoneClick(Sender: TObject);
var
Handler1, Handler2: THandler;
begin
Handler1 := TConcreteHandler1.Create;
Handler2 := TConcreteHandler1.Create;
try
Handler1.Successor := Handler2;
Handler1.HandleRequest;
finally
Handler1.Free;
Handler2.Free;
end;
end; procedure TForm1.SelfDoneClick(Sender: TObject);
var
Handler1, Handler2: THandler;
begin
Handler1 := TConcreteHandler1.Create;
Handler2 := TConcreteHandler1.Create;
try
Handler1.HandleRequest;
finally
Handler1.Free;
Handler2.Free;
end;
end; end.

Delphi 设计模式:《HeadFirst设计模式》---行为模式之责任链模式的更多相关文章

  1. 设计模式之jdk动态代理模式、责任链模式-java实现

    设计模式之JDK动态代理模式.责任链模式 需求场景 当我们的代码中的类随着业务量的增大而不断增大仿佛没有尽头时,我们可以考虑使用动态代理设计模式,代理类的代码量被固定下来,不会随着业务量的增大而增大. ...

  2. Java 设计模式系列(二二)责任链模式

    Java 设计模式系列(二二)责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求 ...

  3. Python的组合模式与责任链模式编程示例

    Python的组合模式与责任链模式编程示例 这篇文章主要介绍了Python的组合模式与责任链模式编程示例,组合模式与责任链模式都属于Python的设计模式,需要的朋友可以参考下 组合模式 我们把Com ...

  4. Java设计模式(19)——行为模式之责任链模式(chain of responsibilitiy)

    一.概述 概念 UML简图 角色 抽象处理器:定义处理请求的接口 具体处理器:接收到请求后可以选择处理,也可以选择发给下家处理(持有下家的引用) 当然这里必须指出,实际中纯的责任链模式很难寻找,一般是 ...

  5. 设计模式之(十四)责任链模式(Chain of Responsibility)

    在业务场景中,有很多是需要审批的.审核方式还可能常常发生变化,而责任链模式就是为了解决这种场景的情况的. 责任链模式定义:十多个对象都有机会处理请求,从而避免发送者和接受者之间的耦合关系.讲这些对象连 ...

  6. 【责任链模式】责任链模式结合Spring实战Demo

    备注: 责任链与策略模式有很多相似之处,如都是行为型设计模式,都能够处理代码中的if-else逻辑 主要区别在于: 策略模式 封装了算法,通过上下文对象去接受客户端的数据,根据数据类型执行不同的算法 ...

  7. 十一个行为模式之责任链模式(Responsible Chain Pattern)

    定义: 将具有相同接口的责任类串行在一起,解耦请求的发送者和处理者.沿着这条链进行请求,直到有对象处理它为止. 结构图: Handler:抽象处理类,定义了所有责任类处理方法的接口,不同的处理方法在子 ...

  8. Java设计模式从精通到入门一 责任链模式

    ​ 一直都想对设计模式有一个深刻的认识,这样对于阅读源码的时候就不会那么吃力了.于是有了想要记录下设计模式的笔记.打算从自己不怎么熟悉的设计模式开始写,里面穿插着一点自己的想法,希望自己写完后,会又一 ...

  9. 设计模式学习总结(十)责任链模式(Chain Of Responsibility)

    责任链主要指通过一连串的操作来实现某项功能或者在处理相关的业务时,对于自己的业务则进行处理,反之,对于不属于自己的业务,则进行下发!   一.示例展示: 以下例子主要通过对煤矿对井下警告信息的处理来进 ...

随机推荐

  1. 修改web项目的启动页

    修改web项目的启动页

  2. STM32 解析futaba S-bus协议

    S-bus为futaba使用的串行通信协议.实际上为串口通信.但是有几点需要注意: 在大端小端上,网上资料都说的不是很清楚: 跟TTL串口信号相比,S-bus的逻辑电平是反的,需用如下电路对电平反相, ...

  3. 无法启动此程序,因此计算机中丢失VCRUNTIME140.dll。

    在mysql-8.0.12-winx64创建data文件夹 在cmd终端 初始化 MYSQL: mysqld --initialize-insecure MySQL加入Windows服务:mysqld ...

  4. 第二周课堂笔记2th

    ---恢复内容开始--- 1. 2.索引取单个值 取多个值叫切片, 切片:取多个值 从左到右取值: 原则:顾头不顾尾 1, a[0:3] abc 2, a[-5:-2] abc 3, a[0:-2] ...

  5. 小程序开发之wepy框架

    ps 本教程使用wepy 1.7+以上的版本 wepy-让小程序支持组件化开发的框架 鹅厂出品,用于开发自家产品的框架还是很良心的,框架设计思路上参照vue,但不是全部照搬,这点要注意. 对微信小程序 ...

  6. springcloud系列13 config的客户端使用

    config客户端的使用: 也是首先要引入依赖: <dependency> <groupId>org.springframework.cloud</groupId> ...

  7. web系统基础

    网络标准体系架构 B/S(browser/server浏览器)服务器有iis.apache.Tomcat.Ngix.Lighttp等 C/S(client/server客户端)如微信.QQ.Outlo ...

  8. 2019-8-2-WPF-依赖属性绑定不上调试方法

    title author date CreateTime categories WPF 依赖属性绑定不上调试方法 lindexi 2019-08-02 19:56:32 +0800 2019-8-2 ...

  9. android 遍历控件

    做个笔记 androuid 遍历一个 view 下面的子view // 保存 btnSaveRout.setOnClickListener(new OnClickListener() { @Overr ...

  10. 2016.10.4初中部下午NOIP普及组比赛总结

    2016.10.4初中部下午NOIP普及组比赛总结 这次的题有些水,只是第四题有点坑. 题目: 比赛:AC+0+AC+50=250 改题:AC+AC+AC+50=350 一.Bill 满地都是水 题目 ...