命令模式

最后更新于:2022-04-01 10:51:53

## 问题 当你自己的代码运行时,你需要使用其他另外的对象来处理。 ## 方法 使用[命令模式](http://en.wikipedia.org/wiki/Command_pattern)把引用传递给你的函数。 ~~~ # Using a private variable to simulate external scripts or modules incrementers = (() -> privateVar = 0 singleIncrementer = () -> privateVar += 1 doubleIncrementer = () -> privateVar += 2 commands = single: singleIncrementer double: doubleIncrementer value: -> privateVar )() class RunsAll constructor: (@commands...) -> run: -> command() for command in @commands runner = new RunsAll(incrementers.single, incrementers.double, incrementers.single, incrementers.double) runner.run() incrementers.value() # => 6 ~~~ ## 详解 承袭自JavaScript,由于函数是第一类对象,且函数与变量作用域绑定的关系,CoffeeScript让这个模式几乎不可见。事实上,所有把函数作为一个回调传递时都可以看作是一个_命令_。 jQuery AJAX方法返回的 `jqXHR`对象使用的就是这种模式。 ~~~ jqxhr = $.ajax url: "/" logMessages = "" jqxhr.success -> logMessages += "Success!\n" jqxhr.error -> logMessages += "Error!\n" jqxhr.complete -> logMessages += "Completed!\n" # On a valid AJAX request: # logMessages == "Success!\nCompleted!\n" ~~~
';