首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >设计模式:责任链模式(Chain of Responsibility)

设计模式:责任链模式(Chain of Responsibility)

作者头像
firstxinjie
发布于 2025-04-29 14:51:38
发布于 2025-04-29 14:51:38
11100
代码可运行
举报
文章被收录于专栏:X#(XSharp)X#(XSharp)
运行总次数:0
代码可运行

责任链模式是行为模式中的一种。它允许将请求沿着潜在处理者链传递,直到其中一个处理者处理该请求。

它具有以下核心特点:

- 业务逻辑由多个独立环节组成,各环节没有特定顺序的要求(但是也可以是特定的顺序);

- 各环节处理逻辑相对独立,不依赖其他环节的处理逻辑;

- 不强制要求前序环节必须成功;

- 任一环节可自主决定是否中止流程。

在标准情况下,责任链模式需要一个接口和一个抽象类。但是在 VFP 中,虽然可以通过类模板模拟接口并通过技巧阻止类的实例化,基于我对 VFP 的理解,它们应该是可以合二为一的。也就是具体的环节处理都有单独的类来实现;而所有环节中执行单独逻辑的类,拥有一个共同的父类(抽象类):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Define Class AbstractHandler As Custom
	oNextHandler = .Null.

	*** <summary>
	*** 模拟抽象类,禁止实例化
	*** </summary>
        Procedure Init()
            Return .F.
        Endproc

	*** <summary>
	*** 设置下一个环节所使用的处理者
	*** </summary>
	*** <param name="toHandler">下一个处理者</param>
	*** <returns>处理者本身,以便可以进行链式调用。</returns>
	*** <remarks>
	*** 你可以通过调用一个处理者的方法来设置其下一个处理者。
	*** 注意,你可以将请求处理者设置为自身,从而形成一个环。
	*** </remarks>
        Procedure SetNext(toHandler As AbstractHandler) As AbstractHandler
            This.oNextHandler = m.toHandler

            Return m.toHandler
        Endproc

	*** <summary>
	*** 处理者通常会对其请求进行一些处理,然后将其传递给下一个处理者。
	*** 或者,对于最终处理者,它可能会处理请求。
	*** </summary>
	*** <param name="toRequest">包含请求的对象</param>
	*** <remarks>
	*** 子类可以重写该方法,但通常它应该至少调用父类的方法。
	*** 这样,每个处理者都可以访问其下一个处理者。
	*** </remarks>
        Procedure Handle(toRequest As Object) As Object
            If This.oNextHandler <> .Null.
                This.oNextHandler.Handle(m.toRequest)
            Endif

            Return .Null.
        Endproc
Enddefine

假设存在两个环节:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Define Class StepOne as AbstractHandler
        Procedure Init
		NoDefault
	EndProc 

        Procedure Handle(toRequest As Object) As Object
		If 条件 = .T.
                    Return 结果
		EndIf 

              Return DoDefault(m.toRequest)
	EndProc 
EndDefine

Define Class StepTwo as AbstractHandler
        Procedure Init
		NoDefault
	EndProc 

        Procedure Handle(toRequest As Object) As Object
		If 条件 = .T.
                    Return 结果
		EndIf 

              Return DoDefault(m.toRequest)
	EndProc 
EndDefine

这样,我们的代码大概就类似于下面的样子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
*!* 假设存在包含请求的对象 loRequest
Local loStepOne as StepOne, loStepTwo as StepTwo
m.loStepOne		= CreateObject("StepOne")
m.loStepTwo		= CreateObject("StepTwo")
*!* m.loStepThree	= CreateObject("StepThree")

*!* 构造责任链
m.loStepOne.SetNext(m.loStepTwo)
*!* m.loStepTwo.SetNext(m.loStepThree)

m.loStepOne.Handle(m.loRequest)

尽管责任链模式可以用于特定顺序的业务逻辑,但是针对特定的处理顺序,责任链模式未必是最佳选择。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 xinjie的VFP 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ERROR 1146 (42S02): Table ‘database.table‘ Doesn‘t Exist:完美解决方法
大家好,我是默语!在今天的技术博客中,我们将探讨 MySQL 数据库中遇到的 ERROR 1146 (42S02): Table 'database.table' doesn't exist 错误。这个错误通常发生在执行 SQL 查询时,表 database.table 无法找到。在本文中,我们将详细分析导致这一问题的原因,提供详细的诊断和解决方法,并讨论一些最佳实践。通过代码示例和深入的技术讲解,帮助您迅速解决这一常见的数据库问题。🔍
默 语
2024/11/22
8980
sqllite入门笔记
目前,几乎所有版本的 Linux 操作系统都附带 SQLite。所以,只要使用下面的命令来检查您的机器上是否已经安装了 SQLite。
暖月寒星
2020/03/11
3.7K0
SQLite---使用触发器(Trigger)
当数据库中的数据太多时,往往需要进行清理,将一些过时的数据删除,但是往往找不到合适的时机进行清理。于是SQLite提供了Trigger,当某些事件发生时,可以触发并且进行处理。
None_Ling
2018/12/06
2.7K0
MySQL:DDL 数据定义语句盘点
DDL(Data Definition Language),即数据定义语句,功能就是定义数据库DATabase、表table、索引index、视图view、列column等
栗筝i
2022/12/01
6530
Android之SQLite的Sql语言介绍
所有的 SQLite 语句可以以任何关键字开始,如 SELECT、INSERT、UPDATE、DELETE、ALTER、DROP 等,所有的语句以分号 ; 结束。
李小白是一只喵
2021/12/06
5230
学习SQLite之路(四)
20160621 更新 参考: http://www.runoob.com/sqlite/sqlite-tutorial.html 1. SQLite   alter命令:不通过执行一个完整的转储和数据的重载来修改已有的表。 可以使用 ALTER TABLE 语句重命名表,使用 ALTER TABLE 语句还可以在已有的表中添加额外的列。 在 SQLite 中,除了重命名表和在已有的表中添加列,ALTER TABLE 命令不支持其他操作(在其他数据库中可以改变表中列的数据类型,删除表中的列) (1)基本语
xcywt
2018/01/11
2.1K0
学习SQLite之路(四)
SQLite数据库使用CREATE TABLE语句创建一个新表
SQLite 的 CREATE TABLE 语句用于在任何给定的数据库创建一个新表。创建基本表,涉及到命名表、定义列及每一列的数据类型。
用户4988376
2021/08/13
2.5K0
sql sql 数据定义语言 (DDL)
SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。
葫芦
2019/04/17
1.3K0
SQLite 创建表的方法
SQLite 的 CREATE TABLE 语句用于在任何给定的数据库创建一个新表。创建基本表,涉及到命名表、定义列及每一列的数据类型。
用户4988085
2021/09/17
2.7K0
SQL命令 DROP TABLE
DROP TABLE命令删除一个表及其对应的持久化类定义。如果该表是其架构中的最后一项,则删除该表也会删除该架构及其相应的持久化类包。
用户7741497
2022/05/05
1.4K0
学习SQLite之路(二)
  下面就是真正关于数据库的一些知识了: 20160614更新  参考: http://www.runoob.com/sqlite/sqlite-tutorial.html 1. SQLite创建表: 基本语法: CREATE TABLE database_name.table_name(    column1 datatype  PRIMARY KEY(one or more columns),    column2 datatype,    column3 datatype, .....    col
xcywt
2018/01/11
2.2K0
学习SQLite之路(二)
PostgreSQL 使用 DROP TABLE 语句来删除表格
PostgreSQL 使用 DROP TABLE 语句来删除表格,包含表格数据、规则、触发器等,所以删除表格要慎重,删除后所有信息就消失了。
用户5005176
2021/08/11
1.3K0
[Python从零到壹] 八.数据库之MySQL和Sqlite基础操作万字详解
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,在数据库管理系统中,用户可以对数据进行新增、删除、更新、查询等操作,从而转变为用户所需要的各种数据,并进行灵魂的管理。
Eastmount
2021/12/02
1.5K0
[Python从零到壹] 八.数据库之MySQL和Sqlite基础操作万字详解
玩转SQLite2:SQLite命令行基本操作
例如,使用sqlite3 test1.db创建test1数据库,然后使用.databases查看数据库
xxpcb
2021/12/15
9270
玩转SQLite2:SQLite命令行基本操作
【DB笔试面试813】在Oracle中,什么是闪回删除(Flashback DROP)?回收站的作用是什么?​
【DB笔试面试813】在Oracle中,什么是闪回删除(Flashback DROP)?回收站的作用是什么?
AiDBA宝典
2020/06/05
8970
软件测试|SQL如何创建删除表,你会了吗?
之前我们介绍了SQL中如何创建删除使用数据库,本篇文章我们将介绍创建删除表等操作。
霍格沃兹测试开发Muller老师
2023/05/07
5770
基于Python的SQLite基础知识学习
前一段时间偶然的看到了一个名词SQLite3,大概了解到此为一种轻量型的关系型数据库。官网介绍到SQLite是一个进程内库,它实现了一个自包含的、无服务器的、零配置的事务性SQL数据库引擎(官网:https://www.sqlite.org/)。后来也是偶然的机会,公司使用的数据库存储有问题,无意中看到了三线开发工程师尽然使用SQLite命令加了一块数据盘上去,故此对SQLite的好奇就更进一步了,下面简单学习介绍一下。
JiekeXu之路
2019/08/15
1.8K0
Hive操作——删除表(drop、truncate)
hive> truncate table 表名; truncate操作用于删除指定表中的所有行,相当于delete from table where 1=1.表达的是一个意思。
大数据流动
2020/08/11
20.7K0
【SQL】进阶知识 -- 删除表的几种方法(包含表内单个字段的删除方法)
大家好!欢迎来到本篇SQL进阶博客。如果你已经掌握了基础的SQL操作,接下来就让我们一起探索删除表的几种方法。删除表可能听起来有点危险,事实也是如此,所以在我们实际开发过程中,大多数时候我们都有数据的使用权限,但没有操作权限。但是有时我们又会碰到不得不删除清理一下数据库的操作——比如不再使用的表,或者删除不必要的列。所以接下来,让我们一起来看看SQL中删除表的几种常用方法。
万事可爱^
2025/01/23
5.2K0
学习SQLite之路(一)
  工作快一年了,接触的东西不是很多,学到的东西也不多。无意中看到公司的代码有一点关于sqlite3的(不是我这一层负责的代码),于是乎就学学试试。  参考: http://www.runoob.com/sqlite/sqlite-tutorial.html  20160612 更新 1,什么是SQLite? SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库。 2.SQLite的优势 不需要一个单独的服务器进程或操作的系统(无服务器
xcywt
2018/01/11
1.9K0
学习SQLite之路(一)
推荐阅读
相关推荐
ERROR 1146 (42S02): Table ‘database.table‘ Doesn‘t Exist:完美解决方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验