命令模式:将回调方法对象化
应用场景:规范回调方式,调用方式 比如MVC中的观察者回调皆为命令对象
谈一点小经验:
在设计命令时将命令中参数尽可能的放在构造中传入 避免出现 void Execute(params T)这种尴尬局面
在一些动态语言中可以使用的闭包的 一个最外层的upvalue直接当作一个命令对象使用 但是当闭包内方法过于复杂时还是封装为具体的命令对象比较简洁
有些不用记录状态的命令可以实例一次无限复用 比如推箱子 方向移动一条命令不需要记录状态 而有些具有撤销操作的命令需要记录这条命令的状态 方便做撤销操作
public interface ICommand { void Execute(); void Execute(PlayerActor actor); //<-尽量不要出现在命令中传参这种局面 命令中枢非常难运维 } public class HideCommand : ICommand { HideCommand(GameObject obj,Transform pos) {//<-一条命令的参数在这里传入 } public void Execute() { throw new System.NotImplementedException(); } public void Execute(PlayerActor actor)//<-错误示范 { throw new System.NotImplementedException(); } }
为什么说闭包机制适合作为命令 可以看到 upvalue就是一个可以记录内部操作和内部数据的容器 天然的命令条例哈哈 lua例子:
function foo () local a, b, c, d local f1 = function () return d + b end local f2 = function () return f1() + a end return f1,f2 end