首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >设计模式:命令模式(Command)

设计模式:命令模式(Command)

作者头像
firstxinjie
发布于 2025-05-02 14:34:43
发布于 2025-05-02 14:34:43
11000
代码可运行
举报
文章被收录于专栏:X#(XSharp)X#(XSharp)
运行总次数:0
代码可运行

命令模式也是行为模式中的一种。它也被称为动作、事务、Action、Transaction、Command。

从它的别称可以看到,它和 VFP 中的命令有着完全不同的内涵。VFP 的命令是语言内置的完成一个动作的指令,而命令模式中的“命令”可以理解为是对一个或多个命令(宏命令)的描述。

在 VFP 中,以下的应用场景可能是最适用的:

  • 主菜单/快捷菜单和命令按钮执行相同的操作;
  • 实现复杂的撤销/重做功能

按照标准的命令模式的说法,首先需要一个接口,在 VFP 中,也就是一个类模板:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Define Class ICommand As Custom
	Procedure Execute()
	Endproc
Enddefine

基于这个模板,可以对所执行的操作定义简单或者复杂的命令类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Define Class SimpleCommand As ICommand
	cCommand = ""

	Procedure Init(tcCommand As String)
		This.cCommand = m.tcCommand
	Endproc

	*** <summary>
	*** 执行简单的命令
	*** </summary>
	Procedure Execute()
		Evaluate(This.cCommand)
	Endproc
Enddefine

Define Class ComplexCommand As ICommnad
	*!* 一些在命令执行过程中需要使用的参数或者对象
	oReceiver	= .null.
	cPara1		= ""
	cPara2		= .F.
	cPara3		= {^2020-01-01}

	Procedure Init(toReceiver As Object, tcString As String, tlLogic As Logical, tdDate As Date)
		With This
			.oReceiver	= m.toReceiver
			.cPara1		= m.tcString
			.cPara2		= m.tlLogic
			.cPara3		= m.tdDate
		Endwith
	Endproc

	Procedure Execute()
		This.oReceiver.DoSomething(This.cPara1)
		This.oReceiver.DoSomething2(This.cPara2)
		This.oReceiver.DoSomething3(This.cPara3)
		This.oReceiver.DoSomething4()
	Endproc
Enddefine

在上面的代码中,ComplexCommand 类的 oReceiver 熟悉所存储的对象,在命令模式中称之为“接收者”。与之对应的,自然存在一个“调用者”。但是,“调用者”是必须存在的,而“接收者”则未必需要存在。

我们先定义好一个“接收者”:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Define Class Receiver As Custom
	Procedure DoSomething(tcString As String)
		*!* 接收参数,执行一些操作
	Endproc

	Procedure DoSomething2(tlLogic As Logical)
		*!* 接收参数,执行一些操作
	Endproc

	Procedure DoSomething3(tdDate As Date)
		*!* 接收参数,执行一些操作
	Endproc

	Procedure DoSomething4()
		*!* 执行一些操作
	Endproc
Enddefine

至此,可以看到,命令模式似乎对复杂“命令”的场景下似乎有存在的必要,在简单命令的场景下似乎多此一举。对于简单命令这种场景,它的存在也许仅有以下的意义:

  • 作为“占位命令”或“默认命令”;
  • 保持命令模式的统一;
  • 为将来预期的复杂命令场景做准备。

最后,我们需要一个“调用者”:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Define Class Invoker As Custom 
	oFirst	= .NULL.
	oSecond	= .NULL.

	PROCEDURE SetFirst(toObject As ICommand)
		This.oFirst = m.toObject
	EndProc

	Procedure SetSecond(toObject As ICommand)
		This.oSecond = M.toObject
	EndProc

	Procedure DoSomething()
		With This
			If Vartype(.oFirst) = "O"
				.oFirst.Excute()
			EndIf 

			If Vartype(.oSecond) = "O"
				.oSecond.Excute()
			EndIf 
		EndWith 
	EndProc
EndDefine 

那么,“当你点击菜单项或者按钮”时的代码是什么样的呢?

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
设计模式:备忘录模式(Memento)
发起者是直接导致需要进行快照的对象状态变更的类。在 VFP 中,大致可以这样定义:
firstxinjie
2025/05/12
850
设计模式:备忘录模式(Memento)
设计模式:装饰器模式(Decorator)
相较于后者,装饰器模式结构更清晰,也更容易扩展。但是对于可视组件进行“装饰”,会增加布局的复杂性,以及考虑状态的同步。因此,对于简单的场景,可以直接继承,而对于复杂的场景则可以选择其他的设计模式。
firstxinjie
2025/05/18
1650
设计模式:装饰器模式(Decorator)
设计模式:中介者模式(Mediator)
在 VFP 中你是否遇到过这样的场景:明明已经释放了表单,但是表单仍旧顽固的显示在屏幕中?好吧,这其实是因为某些引用没有被释放。在该设计模式下,更准确的说,是在代码中存在双向引用。
firstxinjie
2025/05/08
1360
设计模式:中介者模式(Mediator)
设计模式:组合模式(Composite)
大道至简,设计模式真的很奇妙。如果你还未领悟其中的精髓,请随我来(欢迎留言或私信报名参与下月开始的培训:VFP高效编程之设计模式)。
firstxinjie
2025/05/17
980
设计模式:组合模式(Composite)
设计模式:责任链模式(Chain of Responsibility)
责任链模式是行为模式中的一种。它允许将请求沿着潜在处理者链传递,直到其中一个处理者处理该请求。
firstxinjie
2025/04/29
1320
设计模式:责任链模式(Chain of Responsibility)
设计模式:建造者设计模式(Builder)(2)
关于该设计模式在 VFP 中的应用示例,我考虑了很久。最终决定以主程序的伪代码来做。它至少有两个作用:
firstxinjie
2025/04/19
1110
设计模式:建造者设计模式(Builder)(2)
设计模式:迭代器模式(Iterator)
从这句话里,基本可以理解“迭代”的含义:重复,以之前结果为起点的重复的动作。放置编程的语境中,迭代器可以认为是对一组特定算法的抽象。
firstxinjie
2025/05/06
1260
设计模式:迭代器模式(Iterator)
设计模式:单例模式(Singleton)(1)
该模式的核心就是在一个应用程序生命周期中仅存在唯一的类实例。因此,在 VFP 中,最简单的实现方式就是在 VFP 主程序中存在类似下面的代码:
firstxinjie
2025/04/26
1020
设计模式:单例模式(Singleton)(1)
设计模式:工厂方法模式(Factory Method)(2)
当年做一个项目时,还不懂什么是设计模式,仅仅是按照经验完成了需求。回头看看,就是暗合桥接模式。但是,在整个需求实现过程中,甲方需要我在已经设计好的标准业务逻辑中添加非标的需求,因为,在他们眼里,从业务角度来看,是自然的拓展。
firstxinjie
2025/04/23
990
设计模式:工厂方法模式(Factory Method)(2)
设计模式:状态模式(State)
按照标准的描述,该模式“让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。”
firstxinjie
2025/05/12
1000
设计模式:状态模式(State)
设计模式 ( 十三 ) 命令模式Command(对象行为型)
宏命令又称为 组合命令 ,它是 命令模式和组合模式 联用的产物: 宏命令也是一个具体命令,不过它包含了对其他命令对象的引用, 在调用宏命令的 execute() 方法时,将递归调用它所包含的每个成员命令的 execute() 方法 ,一个宏命令的成员对象可以是简单命令,还可以继续是宏命令。执行一个宏命令将执行多个具体命令,从而实现对命令的批处理。 Ÿ
黄规速
2022/04/14
3710
设计模式 ( 十三 ) 命令模式Command(对象行为型)
VFP如何做一个超类,如此万物皆对象
所谓“超类”,也就是说,其他所有的类都是从它继承而来。.NET 中对 Object 类的描述如下:支持 .NET 类层次结构中的所有类,并为派生类提供低级别服务。 这是所有 .NET 类的最终基类;它是类型层次结构的根。换句话说,整个 .NET 平台上所有的类,都是从 Object 类继承而来。
加菲猫的VFP
2023/08/21
3230
VFP如何做一个超类,如此万物皆对象
设计模式第四讲--命令模式
命令模式最初来源于图形化用户界面设计,但现在广泛应用于企业应用设计,特别促进了控制器(请求和分发处理)和领域模型(应用逻辑)的分离.说的更简单一点,命令模式有助于系统更好的进行组织,并易于拓展。
用户2825413
2019/07/16
3120
设计模式第四讲--命令模式
一个扩展的 InputBox() -- EmInputBox
VFP 的 InputBox() 函数仅仅允许单行文本,但是,如果需要多行文本,是不是就束手无策了呢?
firstxinjie
2024/12/06
1230
一个扩展的 InputBox() -- EmInputBox
设计模式---命令模式
命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志。以及支持可撤销的操作。   讲一个模式时,从定义上是不能体会其中的技巧,所以接着我会通过举例子来说明命令模式。
Wu_Candy
2022/07/04
2250
设计模式---命令模式
常用设计模式——命令模式
将"请求"封装成对象,以便使用不同的请求、队列、或者日志来参数化其他对象(就是命令对象拥有相同的接口,不同的命令对象可以被设置到调用者中)。命令模式也可以支持撤销操作。
用户5325874
2020/01/16
3820
常用设计模式——命令模式
命令模式(Command Pattern)
命令模式(Command),將一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。——《设计模式:可复用面向对象软件的基础》
mingmingcome
2021/11/29
5160
命令模式(Command Pattern)
命令模式(Command)
命令模式是一种行为型模式,它可将请求转换为一个包含与请求相关的所有信息的独立对象。该转换让你能根据不同的请求将方法参数化、延迟请求执行或将其放入队列中,且能实现可撤销操作。 简单来说,命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。
兜兜转转
2023/03/08
5620
命令模式(Command)
重温设计模式 --- 命令模式
命令模式是一种行为型设计模式,它将请求封装成一个对象,从而允许你将不同的请求对客户端参数化,将请求排队或记录请求日志,以及支持可撤销的操作。
Niuery Diary
2023/10/22
2110
重温设计模式 --- 命令模式
设计模式- 命令模式(Command Pattern)
定义 命令模式的目的是解除命令发出者和接收者之间的紧密耦合关系,使二者相对独立,有利于程序的并行开发和代码的维护。命令模式的核心思想是将请求封装为一个对象,将其作为命令发起者和接收者的中介,而抽象出来的命令对象又使得能够对一系列请求进行操作,如对请求进行排队,记录请求日志以及支持可撤销的操作等。 C#例子 public abstract class Command { public abstract void Excute(Receiver receiver);
易兒善
2019/05/14
5040
相关推荐
设计模式:备忘录模式(Memento)
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档