命令模式将着眼点放在了一个命令,或更准确来说,用英文单词Command来表示,它是一发命令,一条指令,一次操作,一个动作。命令模式就是希望将Command的具体方法,封装在一个具体类中,然后通过对这个类的串联、封装、调用等进行原子化的操作或逆操作(撤销)将Command运用起来。
我们先来看一下命令模式的UML设计图:
命令模式
网上很多文章其实对Receive这个角色的意义没有正确地认识。它实际上作为方法(Action)的封装,更多地应该是用来作为回调方法储存业务逻辑的。
其实一个按钮(Button)的点击就可以看成一个命令模式,当我点击(click)时,其实后端调用了它所绑定的onClick方法,这个方法具体会执行什么代码,则是在Receiver中预先定义好的Action方法完成的。
public abstract class OnClickCommand{
public abstract void onClick();
}
public class ConcreteClickCommand extends OnClickCommand{
private Receiver receiver;
public ConcreteClickCommand(Receiver r){
this.receiver = r;
}
public void onClick(){
receiver.action();
}
}
当Invoker发生了Click操作时,就会调用Command的onClick方法进行反馈。而我们需要首先实现Receiver的Action并与ConcreteCommand绑定:
public class Receiver{
public void action(){
System.out.println("Someone clicks me!");
}
}
在main函数中将Receiver的实例传入ConcreteClickCommand中,甚至于更经常的,我们使用匿名类实现方法并传入Command中。这样我们便使用了Command方法完成了一个Button被Click之后的回调。
这一过程实现了两点:
- 将方法封装在一个类中
- 将调用者与方法的实现者完全隔离
另外我们可以灵活的使用命令模式搭配其他设计模式进行如下操作:
- 配合组合模式,可以实现宏的制作和执行;
- 配合备忘录模式,可以实现一个命令的撤销;
- 与单例模式和原型模式轮流切换,实现命令状态的保存和复制;
网友评论