16.7 其他的复合命令设计模式

    现在,我们可以辨别一些不同的复合命令设计模式。在前面的例子中,我们设计了一系列的复合命令。我们可以从bash shell的复合操作符:;, &, |,和组合操作符:(;)中寻找灵感。除了这些之外,我们可以在shell中使用ifforwhile循环。

    我们介绍了Command _ Sequence类中的序列操作符(;)。序列的概念无处不在,所以许多编程语言(例如shell和Python)都不需要显式的操作符,而是简单地使用行末作为隐式的序列操作符语法。

    shell的操作符创建了两个并发执行的命令。我们可以创建一个带有run()方法的Command _ Concurren类,这个类使用multiprocessing创建两个子进程并且会等待这两个子进程结束。

    shell中的|操作符会创建一个管道:一个命令的输出缓冲区是另外一个命令的输入缓冲区,同时,命令是并发执行的。在Python中,我们需要创建一个队列和两个用于读写队列的进程。这是一个更复杂的情况,它包括用队列中的对象填充不同子对象的配置。第12章“传输和共享对象”中有一些结合队列使用multiprocessing在并发进程间传递对象的例子。

    shell中的if语句有许多不同的用例。但是,没有什么令人信服的原因不通过Command子类的一个方法来提供有一个原生的Python实现。创建一个复杂的Command类模仿Python的 if-elif-else处理过程并不会为我们带来什么帮助。我们可以并且也应该只使用Python。

    类似地,shell中的whilefor命令也不需要我们在更高级的Command类中定义。我们可以简单地在Python的方法中使用它们。

    下面是一个for-all的类定义,它将一个现有的命令应用于集合中的所有值。

    class ForAllBetsSimulate( Command ):
      def run( self ):
        for bet_class in "Flat", "Martingale", "OneThreeTwoSix":
          self.betting_rule= bet_class
          self.outputfile= "p3_c16_simulation7
    {0}.dat".format(bet_
    class)
          sim= Simulate_Command()
          sim.config= self
          sim.run()

    我们在应用程序中遍历3个用于下注的类,对于其中的每个类,我们都修改了配置、创建了一个模拟程序并运行。

    请注意,这个for-all类与前面定义的Analyze Command类不兼容。我们不能只是简单地创建能够反映不同业务领域的复合对象。Analyze Command类运行一个单独的模拟程序,但是ForAllBets _ Simulate运行一系列的模拟程序。我们有两种方法可以创建互相兼容的业务领域:可以创建一个AnalyzeAll命令或者ForAllBets Sim and Analyze命令。选用哪种设计取决于用户的需求。