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. 一个系统需要支持交易;

没有评论:
发表评论