Delphi 设计模式:《HeadFirst设计模式》---行为模式之责任链模式
模式解说
责任链模式是一种对象的行为模式,它将处理客户端请求的那些对象联成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
通常使用在以下场合
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设计模式》---行为模式之责任链模式的更多相关文章
- 设计模式之jdk动态代理模式、责任链模式-java实现
设计模式之JDK动态代理模式.责任链模式 需求场景 当我们的代码中的类随着业务量的增大而不断增大仿佛没有尽头时,我们可以考虑使用动态代理设计模式,代理类的代码量被固定下来,不会随着业务量的增大而增大. ...
- Java 设计模式系列(二二)责任链模式
Java 设计模式系列(二二)责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求 ...
- Python的组合模式与责任链模式编程示例
Python的组合模式与责任链模式编程示例 这篇文章主要介绍了Python的组合模式与责任链模式编程示例,组合模式与责任链模式都属于Python的设计模式,需要的朋友可以参考下 组合模式 我们把Com ...
- Java设计模式(19)——行为模式之责任链模式(chain of responsibilitiy)
一.概述 概念 UML简图 角色 抽象处理器:定义处理请求的接口 具体处理器:接收到请求后可以选择处理,也可以选择发给下家处理(持有下家的引用) 当然这里必须指出,实际中纯的责任链模式很难寻找,一般是 ...
- 设计模式之(十四)责任链模式(Chain of Responsibility)
在业务场景中,有很多是需要审批的.审核方式还可能常常发生变化,而责任链模式就是为了解决这种场景的情况的. 责任链模式定义:十多个对象都有机会处理请求,从而避免发送者和接受者之间的耦合关系.讲这些对象连 ...
- 【责任链模式】责任链模式结合Spring实战Demo
备注: 责任链与策略模式有很多相似之处,如都是行为型设计模式,都能够处理代码中的if-else逻辑 主要区别在于: 策略模式 封装了算法,通过上下文对象去接受客户端的数据,根据数据类型执行不同的算法 ...
- 十一个行为模式之责任链模式(Responsible Chain Pattern)
定义: 将具有相同接口的责任类串行在一起,解耦请求的发送者和处理者.沿着这条链进行请求,直到有对象处理它为止. 结构图: Handler:抽象处理类,定义了所有责任类处理方法的接口,不同的处理方法在子 ...
- Java设计模式从精通到入门一 责任链模式
一直都想对设计模式有一个深刻的认识,这样对于阅读源码的时候就不会那么吃力了.于是有了想要记录下设计模式的笔记.打算从自己不怎么熟悉的设计模式开始写,里面穿插着一点自己的想法,希望自己写完后,会又一 ...
- 设计模式学习总结(十)责任链模式(Chain Of Responsibility)
责任链主要指通过一连串的操作来实现某项功能或者在处理相关的业务时,对于自己的业务则进行处理,反之,对于不属于自己的业务,则进行下发! 一.示例展示: 以下例子主要通过对煤矿对井下警告信息的处理来进 ...
随机推荐
- python截图+百度ocr(图片识别)+ 百度翻译
一直想用python做一个截图并自动翻译的工具,恰好最近有时间就在网上找了资料,根据资料以及自己的理解做了一个简单的截图翻译工具.整理一下并把代码放在github给大家参考.界面用python自带的G ...
- tyvj 1194 划分大理石(多重背包)
传送门 解题思路 二进制优化多重背包裸题. 代码 #include<iostream> #include<cstdio> #include<cstring> #in ...
- Font Awesome 完全兼容 Bootstrap 的所有组件。
"F_FullName": "其他", "F_Icon": "glyphicon glyphicon-backward fa-lg ...
- Python flask 构建可扩展的restful apl✍✍✍
Python flask 构建可扩展的restful apl 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课 ...
- BCD Code ZOJ - 3494 AC自动机+数位DP
题意: 问A到B之间的所有整数,转换成BCD Code后, 有多少个不包含属于给定病毒串集合的子串,A,B <=10^200,病毒串总长度<= 2000. BCD码这个在数字电路课上讲了, ...
- 收藏的链接-Git
git远程删除分支后,本地git branch -a 依然能看到的解决办法. - qq_763034592的博客 - CSDN博客 https://blog.csdn.net/qq_16885135/ ...
- nodejs入门最简单例子
一.mac话,先安装nodejs环境: brew install nodejs 二.先写一个main.js var http = require("http"); http.cre ...
- 3.pycharm spark配置
pycharm 内的环境变量配置 选择相应的spark程序文件的对应的配置信息 PYSPARK_PYTHON:python的安装路径 PYTHONPATH:spark安 ...
- php日期
PHP Date() 函数 PHP date() 函数用于格式化时间/日期. 该函数可把时间戳格式化为可读性更好的日期和时间. 时间戳是一个字符序列,表示一定的事件发生的日期/时间. 语法 date( ...
- 扩展IEnumerable<T> ForEach()方法
相信很多人,在用Linq时,都会困惑为什么IEnumerabel<T>没有ForEach,虽然 我们一样可以这样写,很快读写 foreach(item in items) { Cons ...