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)
责任链主要指通过一连串的操作来实现某项功能或者在处理相关的业务时,对于自己的业务则进行处理,反之,对于不属于自己的业务,则进行下发! 一.示例展示: 以下例子主要通过对煤矿对井下警告信息的处理来进 ...
随机推荐
- Mysq 列中存储json格式根据key取value
SELECT DISTINCT (SUBSTRING_INDEX( REPLACE ( 列名称, CONCAT( SUBSTRING_INDEX( 列名称, '"key名称":', ...
- csp-s模拟测试89
csp-s模拟测试89 $T1$想了一会儿没什么思路,一看$T2$ $1e18$当场自闭打完暴力就弃了,$T3$看完题感觉要求$lca$和$dep$,手玩了一下样例发现$lca$很显然,$dep$貌 ...
- Delphi编写后台监控软件
Delphi编写后台监控软件 文章来源:Delphi程序员之家 后台监控软件,为了达到隐蔽监控的目的,应该满足正常运行时,不显示在任务栏上,在按Ctrl+Alt+Del出现的任 ...
- JAVA基础_类加载器
什么是类加载器 类加载器是Java语言在1.0版本就引入的.最初是为了满足JavaApplet需要.现在类加载器在Web容器和OSGI中得到了广泛的应用,一般来说,Java应用的开发人员不需要直接同类 ...
- java_瞬时
瞬时(Instant): 方法: public class InstantTest01 { public static void main(String[] args){ //静态方法,返回utc上的 ...
- java笔试之简单密码
密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了.哇哈哈. 接下来渊子要在密码之上再加一套密码,虽然简单但也安全. 假设渊子原来一个BBS上的密码为zvbo9441987,为了方便 ...
- python3 使用aria2下载的一个脚本
import requests import time ariaurl="http://localhost:6800/jsonrpc" dlurl="http://xxx ...
- csps-模拟7778lrd两试
题面:https://www.cnblogs.com/Juve/articles/11707775.html 位运算: 大力分类讨论 第一次发现若a^b=c,则c^b=a,c^a=b #include ...
- Intel RealSense Depth Camera D435安装ROS 驱动——Ubuntu16.04
官方教程 软件包下载链接 https://github.com/IntelRealSense/realsense-ros Download/Clone librealsense github repo ...
- Centos--swoole平滑重启服务
平滑重启: 已经打开的服务: 首先在server服务中为进程添加名字: /** * @param $server */ public function onStart($server) { swool ...