《敏捷软件开发——原则、模式与实践》
Robert C.Martin 著,邓辉译,孟岩审,清华大学出版社,2003年9月第1版

  没有人天生就具有命令他人的权利。
    ——Denis Diderot(1713-1784,法国哲学家,百科全书编者)


  在近几年记述过的所有设计模式中,我认为COMMAND模式是最简单、最优雅的模式之一。但是我们将会看到,这种简单性是带有欺骗性的。COMMAND模式的适用范围是非常宽广的。
  如图13.1所示,COMMAND模式简单得几乎可笑。程序13.1中的代码并没有起到削弱这种印象的作用。该模式仅由一个具有惟一方法的接口组成,这似乎是荒谬的。
<<interface>>
Command
+do()
图13.1 COMMAND模式

程序13.1 Command.java
public interface Command
{
  public void do();
}
  但是,事实上,该模式横过了一条非常有趣的界线。而这个交界处正是所有有趣的复杂性之所在。大多数类都是一组方法和相应的一组变量的结合。COMMAND模式不是这样的。它只是封装了一个没有任何变量的函数。
  从严格的面向对象意义上来讲,这种做法是被强烈反对的——因为它具有功能分解的味道。它把函数层面的任务提升到了类的层面。这简直是对面向对象的亵渎!然而,在这两个思维范式(paradigm)的碰撞处,有趣的事情发生了。

13.1 简单的COMMAND

  (略,请参看原书)

13.2 事务操作

  (略,请参看原书)

13.3 UNDO

  (略,请参看原书)

13.4 ACTIVE OBJECT模式

  ACTIVE OBJECT模式是我最喜欢使用COMMAND模式的地方之一。这是实现多线程控制的一项古老技术。该模式有多种使用方式,为许多工业系统提供了一个简单的多任务核心。
  想法很简单。考虑程序13.2和程序13.3。ActiveObjectEngine对象维护了一个Command对象的链表。用户可以向该引擎(engine)增加新的命令,或者调用run()。run()函数只是遍历链表,执行并去除每个命令。
(原书中是java程序,现翻译为C#程序,需要C#2.0编译器。根据C#的惯例,接口名称以I开头,方法名称的第一个字母大写。)
程序13.2 ActiveObjectEngine.cs
ACTIVE OBJECT 模式 C# 版using System.Collections.Generic;
ACTIVE OBJECT 模式 C# 版
ACTIVE OBJECT 模式 C# 版
namespace Asd.Chap13
程序13.3 Command.cs
ACTIVE OBJECT 模式 C# 版namespace Asd.Chap13
ACTIVE OBJECT 模式 C# 版using System;
ACTIVE OBJECT 模式 C# 版
using NUnit.Framework;
ACTIVE OBJECT 模式 C# 版
using Asd.Chap13;
ACTIVE OBJECT 模式 C# 版
ACTIVE OBJECT 模式 C# 版
namespace NUnit.Tests.Asd.Chap13
ACTIVE OBJECT 模式 C# 版using System;
ACTIVE OBJECT 模式 C# 版
ACTIVE OBJECT 模式 C# 版
namespace Asd.Chap13
ACTIVE OBJECT 模式 C# 版using System;
ACTIVE OBJECT 模式 C# 版
ACTIVE OBJECT 模式 C# 版
namespace Asd.Chap13

相关文章: