模式解说
责任链模式是一种对象的行为模式,它将处理客户端请求的那些对象联成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
通常使用在以下场合
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. ~/.bashrc的常用alias设置,30 个方便的 Bash shell 别名

    centos6.5/centos7系统中,alias定义在/etc/bashrc,分别写在/etc/profile.d/*.sh中,可以在此目录添加my.sh,或者~/.bashrc,或者~/.bas ...

  2. 如何有效管理Windows系统帐户权限

    权限是Windows管理的基础,当然与Windows用户关系最密切,平时接触最多的是与帐户相关的权限.对于Windows帐户权限的管理,你是否完全了解呢?下面,笔者以Winsows XP为例进行相关测 ...

  3. shiro real的理解,密码匹配等

    1 .定义实体及关系 即用户-角色之间是多对多关系,角色-权限之间是多对多关系:且用户和权限之间通过角色建立关系:在系统中验证时通过权限验证,角色只是权限集合,即所谓的显示角色:其实权限应该对应到资源 ...

  4. substring常用的两种方法

    1.public String substring(int beginIndex, int endIndex) 第一个参数int为开始的索引,对应String数字中的开始位置, 第二个参数是截止的索引 ...

  5. 第三篇:异步请求遇上for循环怎么做

    场景:读取Excel数据(地名),发送请求到百度地图,从返回的json格式数据取出坐标数据(逗号隔开的两个float型数值),拼接成了分号隔开的一个字符串data,接下来需要利用“百度坐标转换API” ...

  6. <随便写>random函数

    import random random,randint(1,100)返回随机数 random.choice(list)从一个列表中随机选取一个元素返回 random.shuffle(list)将列表 ...

  7. h5对接jssdk支付分并调用开启支付分页面

    1.ws.config签名   调用ticket等获取ws.config的签名,下面会调用方法再调用方法时需要再次按照调用方法的签名 wx.config({ debug: true, // 开启调试模 ...

  8. 【案例】鼠标按下,DIV跟随移动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 布局页中的特殊情况(比如说只有某页有的banner)

    仅作代码记录之用 /WEB-INF/tags/section.tag <%@ tag language="java" import="java.util.*,jav ...

  10. 系列文章:云原生Kubernetes日志落地方案

    在Logging这块做了几年,最近1年来越来越多的同学来咨询如何为Kubernetes构建一个日志系统或者是来求助在这过程中遇到一系列问题如何解决,授人以鱼不如授人以渔,于是想把我们这些年积累的经验以 ...