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)
责任链主要指通过一连串的操作来实现某项功能或者在处理相关的业务时,对于自己的业务则进行处理,反之,对于不属于自己的业务,则进行下发! 一.示例展示: 以下例子主要通过对煤矿对井下警告信息的处理来进 ...
随机推荐
- mysql mac客户端: sequel,mysql-workbench
sequel: https://sequelpro.com/download#auto-start mysql-workbench:https://dev.mysql.com/downloads/fi ...
- fastjson 过滤不需要序列化的属性
JSON JSON英文全称为JavaScriptObject Natation,采用key:value键值对的方式存贮数据,与xml格式相比,JSON是一种轻量级的数据交换格式:不要被JavaScri ...
- vs2017 Visual Studio 离线安装方法
转自:http://www.jb51.net/softjc/539858.html 第一部分:离线下载安装文件 这里描述是包括所有版本,截图以下载VS2017社区版为例: ①登入VS官网下载页面,选择 ...
- 2_2.springboot2.x配置之自动配置原理
前言 SpringBoot 自动配置原理: 本文主要分为三大部分: SpringBoot 源码常用注解 SpringBoot 启动过程 SpringBoot 自动配置原理 1. SpringBoot ...
- WPF drag过程中显示ToolTip.
原文:WPF drag过程中显示ToolTip. 在drag/drop过程中,我们在判断出over的元素上是否可以接受drag的东西之后,通常是通过鼠标的样式简单告诉用户这个元素不接受现在drag的内 ...
- http及浏览器相关知识点归纳
http是应用层协议,采用请求/响应模型 1.浏览器地址栏输入URL地址后发生了什么? 浏览器判断地址是否是合理的URL地址,是否是http协议请求,如果是则进入下一步 浏览器对此URL进行缓存检查: ...
- 【期望DP】[UVA1498] Activation
显然是概率DP 我们用dp[i][j]表示队伍中有i个人,lyk的小迷妹现在排在j这个位置时的概率大小 不难列出下列转移方程: (显然已经排到前面k个位置的时候是要加上爆炸也就是p4的概率的) $$f ...
- Android开发 内存泄露检测框架LeakCanary
前言 挖坑后续填坑 中文网站:https://www.liaohuqiu.net/cn/posts/leak-canary-read-me/ gitbub:https://github.com/squ ...
- leetcode-86-分割链表
题目描述: 方法一: # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.va ...
- HTML - 表格标签相关
<html> <head></head> <body> <!-- table (表格) border : 表格的边框 width : 表格的宽 h ...