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 函数的通常实现。

时间: 2024-08-30 09:32:59

8.2.2 命令设计模式(The command design pattern)的相关文章

简单工厂设计模式(Simple Factory Design Pattern)

[引言]最近在Youtub上面看到一个讲解.net设计模式的视频,其中作者的一个理解让我印象很深刻:所谓的设计模式其实就是运用面向对象编程的思想来解决平时代码中的紧耦合,低扩展的问题.另外一点比较有见解的是,区分了设计模式(Design Pattern),结构模式(Architecture Pattern),架构类型(Architecture Style). 如下图所示 Design Pattern:是基于代码层面的,就是针对解决功能模块之间的问题而采用恰当的设计模式,比如依赖注入,简单工厂,适

命令模式 Command design pattern in C++

参考https://sourcemaking.com/design_patterns/command/cpp/2 Create a class that encapsulates some number of the following: a "receiver" object the method to invoke the arguments to pass Instantiate an object for each "callback" Pass each

NET设计模式 第二部分 行为型模式(16):命令模式(Command Pattern)

命令模式(Command Pattern) ——.NET设计模式系列之十七 TerryLee,2006年7月 概述 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合[李建忠].这就是本文要说的Command模式. 意图 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行

.NET设计模式(17):命令模式(Command Pattern)(转)

概述 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合[李建忠].这就是本文要说的Command模式. 意图 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤消的操作.[GOF <设计模式>] 结构图 Command模式

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

基本概念: Command模式也叫命令模式 ,是行为设计模式的一种.Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数,命令模式将方法调用给封装起来了. 命令模式的几个角色: Command: 抽象命令类 ConcreteCommand: 具体命令类 Invoker: 调用者 Receiver: 接收者 Client:客户类 命令模式的优缺点: 优点 1. 降低了系统耦合度 2. 新的命令可以很容易添加到系统中去. 缺点 使用命令模式可能会导致某些系统有过多的具

C#设计模式(15)——命令模式(Command Pattern)

原文:C#设计模式(15)--命令模式(Command Pattern) 一.前言 之前一直在忙于工作上的事情,关于设计模式系列一直没更新,最近项目中发现,对于设计模式的了解是必不可少的,当然对于设计模式的应用那更是重要,可以说是否懂得应用设计模式在项目中是衡量一个程序员的技术水平,因为对于一个功能的实现,高级工程师和初级工程师一样都会实现,但是区别在于它们实现功能的可扩展和可维护性,也就是代码的是否“优美”.可读.但是,要更好地应用,首先就必须了解各种设计模式和其应用场景,所以我还是希望继续完

设计模式(14)--Command(命令模式)--行为型

作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义:   命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式.   命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 2.模式特点: 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序

[Design Pattern] Command Pattern 命令模式

发现公司的代码好像有用到 Command Pattern,回顾重温下. Command Pattern 的类图结构如下: 参考 <Head First Design Patterns(英文版)>P245 绘制 我所理解的 Command Pattern 如图. caller, action, subject 分别对于类图中的 Invoker, Command, Receiver, 他们都可以由使用者 Client 进行配置 参考资料: Head First Design Pattern. 推荐

24种设计模式--命令模式【Command Pattern】

今天讲命令模式,这个模式从名字上看就很简单,命令嘛,老大发命令,小兵执行就是了,确实是这个意思,但是更深化了,用模式来描述真实世界的命令情况.正在看这本书的你,我猜测分为两类:已经工作的和没有工作的,先说没有工作的,那你为啥要看这本书,为了以后工作呗,只要你参加工作,你肯定会待在项目组,那今天我们就以项目组为例子来讲述命令模式. 我是我们部门的项目经理,就是一个项目的头,在中国做项目,项目经理就是什么都要懂,什么都要管,做好了项目经理就能分到一杯羹,做不好都是你项目经理的责任,这个是绝对的,行政