command pattern
UML图如下:
命令模式分为四个角色,分别是Invoker,Command抽象接口,Command实现类和Receiver。
用一个Java与模式上的例子解释,玉皇大帝发圣旨,让太白金星招安孙悟空。这里玉皇大帝就是Client,圣旨有一个抽象接口,可以称作圣旨模板,圣旨则是实现类。而太白金星则是任务直接执行Invoker,孙悟空是任务接受者Receiver,真正的执行代码在孙悟空这里。
用Scala代码实现的命令模式如下:
首先是client代码:
首先是client代码:
object Client extends App { val receiver = new Receiver val command = new ConcreteCommand(receiver) val invoker = new Invoker(command) invoker.action }
然后是Command代码:
2. 允许接受者一方决定是否要否决请求
3. 能较容易的设计一个命令队列
4. 也可以很容易实现对请求的undo和redo。
5. 在需要的情况下,可以很容易的将命令计入日志。
6. 将请求的操作对象和具体执行的操作对象分开;
7. 可以合成命令。
trait Command { def execute }ConcerteCommand:
class ConcreteCommand(re:Receiver) extends Command{ val receiver = re override def execute = receiver.action }Receiver:
class Receiver { def action = { println("Action has been taken.") } }Invoker:
class Invoker(com:Command) { val command = com def action = command.execute }执行结果:
Action has been taken.
命令模式的优点:
1. 新命令很容易加入到系统2. 允许接受者一方决定是否要否决请求
3. 能较容易的设计一个命令队列
4. 也可以很容易实现对请求的undo和redo。
5. 在需要的情况下,可以很容易的将命令计入日志。
6. 将请求的操作对象和具体执行的操作对象分开;
7. 可以合成命令。
命令模式的使用场景
1. 作为回调,先定义好一个函数,在以后调用此函数;
2. 需要在不同的时间请求,将请求排队
3. 系统需要支持命令的撤销;
4. 如果系统需要记录命令日志,方便在系统崩溃后通过日志调用execute方法恢复系统在崩溃前的数据更新;
5. 一个系统需要支持交易;
没有评论:
发表评论