定义
命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持撤销操作。
例子
我们写一个遥控器的例子。在遥控器上按lightOn的按钮,远程控制电灯打开。
interface Command {//命令接口,其他命令需要实现该接口
fun excute()
}
class Light{
fun on(){
println("Light on")
}
fun off(){
println("Light off")
}
}
class LightCommand constructor(light : Light): Command{ //这是一个命令,需要实现command接口
private var light : Light = light//该电灯对象称为接受者,负责接收命令
override fun excute() {//实现excute方法,执行相应操作
light.on()
}
}
class SimpleRemoteControl{
/**
* 一个远程遥控器
*/
lateinit var slot : Command;// 有一个插槽持有命令,而这个命令控制着一个装置
fun setCommand(command: Command){//设置插槽控制的命令
slot = command;
}
fun buttonPress(){//按下按钮的时候,执行命令
slot.excute()
}
}
fun main(args : Array<String>){
val simpleRemoteControl = SimpleRemoteControl()
val lightCommand = LightCommand(Light())
simpleRemoteControl.setCommand(lightCommand)//设置控制灯的命令
simpleRemoteControl.buttonPress()
}
类图
用途
队列请求
命令可以将运算打包(一个接收者和一个动作),然后将它传来传去,就像一般的对象一样。现在,即使在玲玲对象被创建许久之后,运算依然可以被调用,事实上,它甚至可以在不同的线程中被调用,我们可以利用这样的特性衍生一些应用,例如:日志安排、线程池、工作队列。
想象有一个工作队列,你在某一端添加命令,然后另一端则是线程。线程进行下面的动作,从队列中取出一个命令,调用他的excute方法,等待这个调用完成,然后将此命令丢弃,再取出下一个命令。
日志请求
当我们执行命令的时候,将历史记录存储在磁盘中。一旦系统死机,就可以将命令对象重新加载,并成批一次调用这些对象的excute()方法,