admin管理员组文章数量:1027614
设计模式:命令模式(Command)
命令模式也是行为模式中的一种。它也被称为动作、事务、Action、Transaction、Command。
从它的别称可以看到,它和 VFP 中的命令有着完全不同的内涵。VFP 的命令是语言内置的完成一个动作的指令,而命令模式中的“命令”可以理解为是对一个或多个命令(宏命令)的描述。
在 VFP 中,以下的应用场景可能是最适用的:
- 主菜单/快捷菜单和命令按钮执行相同的操作;
- 实现复杂的撤销/重做功能
按照标准的命令模式的说法,首先需要一个接口,在 VFP 中,也就是一个类模板:
代码语言:javascript代码运行次数:0运行复制Define Class ICommand As Custom
Procedure Execute()
Endproc
Enddefine
基于这个模板,可以对所执行的操作定义简单或者复杂的命令类:
代码语言:javascript代码运行次数:0运行复制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运行复制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运行复制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 删除对象设计模式commandprocedurethis设计模式:命令模式(Command)
命令模式也是行为模式中的一种。它也被称为动作、事务、Action、Transaction、Command。
从它的别称可以看到,它和 VFP 中的命令有着完全不同的内涵。VFP 的命令是语言内置的完成一个动作的指令,而命令模式中的“命令”可以理解为是对一个或多个命令(宏命令)的描述。
在 VFP 中,以下的应用场景可能是最适用的:
- 主菜单/快捷菜单和命令按钮执行相同的操作;
- 实现复杂的撤销/重做功能
按照标准的命令模式的说法,首先需要一个接口,在 VFP 中,也就是一个类模板:
代码语言:javascript代码运行次数:0运行复制Define Class ICommand As Custom
Procedure Execute()
Endproc
Enddefine
基于这个模板,可以对所执行的操作定义简单或者复杂的命令类:
代码语言:javascript代码运行次数:0运行复制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运行复制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运行复制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 删除对象设计模式commandprocedurethis本文标签: 设计模式命令模式(Command)
版权声明:本文标题:设计模式:命令模式(Command) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/jiaocheng/1747419145a2165433.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论