8.2.2 命令设计模式(The command design pattern)

728 篇文章 1 订阅
349 篇文章 0 订阅

8.2.2 命令设计模式(The command design pattern)

 

命令模式(commandpattern)所描述的方法,表示在应用程序中的动作,相对于前一个模式,它常用于参数化已知的行为(比如,筛选列表)但缺少部分(条件),而命令模式经常保存某些“工作单元”,能够在以后调用。我们经常看到命令集合,用来描述用户可以选择处理或操作的步骤。看一下图8.2,就会认识到,接口看起来像可以用函数替换的很好候选。


图8.2 Invoker 保存实现 Command 接口类的集合。当调用时,具体命令使用 Receiver 对象,它通常携带并修改了某些状态。

 

能够很容易地用函数替换的类型是 Command 接口。另外,它还有一个方法,承担揭示作用。实现接口(比如,ConcreteCommand)的类可以转换成函数,既可以使用 lambda 函数的语法来构造,更复杂时,还可以写作普通函数。

我们提到过,命令模式和策略模式之间的区别是,Invoker 处理命令列表,并在需要时执行它们,非常相似于客户贷款的例子。我们有一个测试集合,用来检查客户是否合适,但我们的函数版本没有声明 Command 接口,而是使用 C# 中的 Func<Client, bool>委托,和 F# 中的函数类型Client -> bool。调用是 TestClient 方法,它使用测试来检查客户。

 

注意

 

我们解释过,Receiver类,通常表示某种状态,在命令调用时可以改变,如图8.2所示。在一个典型的面向对象程序中,这可能是应用程序状态的一部分;在图形编辑器中,我们可以使用命令表示撤消历史记录,那时,状态就是能够应用撤消步骤的图片。

这并不是在函数编程中使用模式的方式,命令通常返回某种结果(比如,在我们的客户检查示例中的布尔值),而不是修改状态。在函数编程中,Receiver 可以是 lambda 函数捕获的值。

 

在函数式编程中,虽然通常应该避免使用可变状态,但是,有示例说明它还是有用的,即使在 F# 中。我们将看到,类似于命令模式的技术可以有助于对外隐藏状态,如果我们想保持大多数程序是纯函数式,这是很重要的。首先看一下 C# 中的类似做法,然后,再讨论在 F# 中,使用 lambda 函数的通常实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值