针对问题:在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间的松耦合。这就是命令模式。在命令模式上可以看到观察者模块和代理模块的影子,事实上就是两者的结合。
命令模式结构图:
命令模式实现代码:
/**
* 命令接口
* @author bruce
*
*/
public interface Command {
public void execute();
}
/**
* 行为类
* @author bruce
*
*/
public class Receiver {
public void action(){
System.out.println("really doing something");
}
}
/**
* 命令实现类
* @author bruce
*
*/
public class ConcreteCommand implements Command{
private Receiver receiver; //组合行为对象
public ConcreteCommand(Receiver receiver){
this.receiver=receiver;
}
public void execute() {
// TODO Auto-generated method stub
System.out.println("start");
receiver.action();
}
}
/**
* 调用者对象
* @author bruce
*
*/
public class Invoker {
private Command command;
public void setCommand(Command command){
this.command=command;
}
public void runCommand(){
if(command==null)return;
command.execute();
}
}
/**
* 测试
* @author bruce
*
*/
public class Client {
public static void main(String[] args) {
Receiver receiver=new Receiver();
Command command=new ConcreteCommand(receiver);
Invoker invoker=new Invoker();
invoker.setCommand(command);
invoker.runCommand();
/**
* output://
start
really doing something
*/
}
}