Command 命令模式是一种对象行为型模 式,它主要解决的问题是:在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”的问题。如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/c48eb11d937a58724dd21cf07d1fee9f.jpeg)
有时我们必须向某对象提交请求,但并不知道关于被请求的操作或请求的接受者的任何信息,此时无法抵 御变化的紧耦合是不合适的。如:需要对行为进行“记录、撤销 / 重做、事务”等处理。我们所要做的是将依赖关系转化,将紧耦合变为松耦合。则上图的形式转化为如下形 式:
![](https://i-blog.csdnimg.cn/blog_migrate/dafe4184e354463f11242e82d03923ff.jpeg)
Command 模式通 过将请求本身变成一个对象来使行为请求者可向未指定的应用对象提出请求。
GoF 《设计模式》中 说道:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
Command 命令模式结构:
![](https://i-blog.csdnimg.cn/blog_migrate/8f3b7f5ff91147b608be654a0c7ad234.jpeg)
command 模式 就是 client去 调用invoker,invoker去调用command,command去调用receiver,然后receiver在client显示。
我在RCP项目中,要实现一个命令,并且有它的undo,redo功能。
比如我在一个数据操作类里,写上
public void editFormalParam(Client tab, Parameter pParam) {
EditParamCommand cmd = new EditParamCommand(model);
........................................
final EditParamCommand pCmd = cmd;
SafeAction safeAction = new SafeAction(BuildingblockeditorPluginResources.SACFACTION.toString()) {
public void runSafe() {
getCommandStack().execute(pCmd);
}
};
safeAction.run();
}
这时候client要执行editFormalParam方法, 就会去执行 command里的execute方法。
这个数据操作类就是一个invoker,它去执行command里的execute方法。
我们同时在command类里实现了
public class EditParamCommand {
private Model model;
private Object new;
private Object old;
public EditorParamCommand(Model model,Object new,Object old){
this.model=model;
this.new=new;
this.old=old;
}
public void execute(){
model.get...;
mode.set...;
}
public void redo(){
model.set(new);
}
public void undo(){
model.set(old);
}
}
这里的model就是receiver.
然后把model变化后的数据返回client,刷新。