命令模式(Command Patter):将请求、命令、动作封装成对象,这样可以让项目使用这些对象去参数化其他对象,使得命令的请求者和执行者解耦。像工作流activiti框架中就大量的使用了命令模式
命令模式一般可认为包括下面三个角色:
1)请求者(invoker):即命令的发起方
2)命令(command)类:一般使用抽象类或者接口定义command,以及实现该接口或继承该抽象类的实体类
3)执行者(receiver):即命令的执行者
命令模式一般使用在命令的请求者和命令的执行者(接收者)之间互不相关的情况下,即请求者和执行者(接收者)之间的变化互不影响。例如开关和电器,这两者之间互不相干,开关刚买来的时候并不知道是具体用来操作哪个电器的,电器和开关的更新换代也互不影响,它们之间通过电线来相关联。在这个例子中,开关就是请求者,电线就是命令类,电器就是执行者(接收者)。
下面通过一个简单的例子来演示命令模式的原理:IDE的自定义操作按键功能
1、ide操作接口(接收者)
public interface IDEOperation { void deleteLine(); //删除行 void copyLine(); //复制行 void undoOperate(); //回退操作 }
2、ide操作实现类(接收者)
public class IDEOperationImpl implements IDEOperation{ @Override public void deleteLine() { System.out.println("删除一行"); } @Override public void copyLine() { System.out.println("复制一行"); } @Override public void undoOperate() { System.out.println("回退操作"); } }
3、命令接口
public interface Command { void execute(); }
4、命令实现类
public class DeleteLineCommand implements Command { private IDEOperation ideOperation; public DeleteLineCommand(IDEOperation ideOperation) { this.ideOperation = ideOperation; } @Override public void execute() { ideOperation.deleteLine(); } }
public class CopyLineCommand implements Command { private IDEOperation ideOperation; public CopyLineCommand(IDEOperation ideOperation) { this.ideOperation = ideOperation; } @Override public void execute() { ideOperation.copyLine(); } }
public class UndoCommand implements Command { private IDEOperation ideOperation; public UndoCommand(IDEOperation ideOperation) { this.ideOperation = ideOperation; } @Override public void execute() { ideOperation.undoOperate(); } }
5、自定义按键的菜单(请求者)
public class Setting { private Command command; public Setting(Command command) { this.command = command; } public void setCommand(Command command) { this.command = command; } public void onKeyDown() { command.execute(); } }
6、测试类
public class MainTest { public static void main(String[] args){ IDEOperation ideOperation = new IDEOperationImpl(); DeleteLineCommand deleteLineCommand = new DeleteLineCommand(ideOperation); CopyLineCommand copyLineCommand = new CopyLineCommand(ideOperation); UndoCommand undoCommand = new UndoCommand(ideOperation); Setting setting = new Setting(deleteLineCommand); setting.onKeyDown(); setting = new Setting(copyLineCommand); setting.onKeyDown(); setting = new Setting(undoCommand); setting.onKeyDown(); } }
输出结果为:
删除一行
复制一行
回退操作
也可以通过在请求者中引用Command[] 来实现宏命令的效果,比如一键回退等这种操作,一般使用Statck栈的方式来做,即先进后出的方式,先通过push加入,回退操作的时候,通过pop依次循环回退之前的操作。操作比较简单,这里就不做演示了。