命令模式(command)
概念:
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的动作。
优点:
1、命令模式将发出请求的对象和执行请求的对象解耦
2、在被解耦的两者之间是通过命令对象进行沟通的。命令对象封装了接收者和一个或一组动作
3、调用者通过调用命令对象的execute()发出请求,这会使得接收者的动作被调用
适用:
抽象出待执行的动作以参数化某对象;在不同的时刻指定、排列和执行请求;支持取消操作;支持修改日志。
示例代码:
/**
* 命令接口
*/
public interface Command {
public void execute();// 执行命令
public void undo(); // 撤销命令
}
/**
* 命令发出者
*/
public class Invoker {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public Command getCommand() {
return command;
}
public void runCommand(){ // 执行命令
command.execute();
}
public void unDoCommand(){//撤销命令
command.undo();
}
}
/**
* 命令接收者,命令真正执行人
*/
public class Receiver {
public void action(){
System.out.println("执行命令...");
}
public void unAction(){
System.out.println("撤销命令...");
}
}
/**
* 将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现excute
*/
public class CreateCommand implements Command{
private Receiver receiver;
public CreateCommand(Receiver receiver){
this.receiver = receiver;
}
public void execute() {
receiver.action();
}
public void undo() {
receiver.unAction();
}
}
/**
* 命令模式的测试
* 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化
* 要点:
1、命令模式将发出请求的对象和执行请求的对象解耦
2、在被解耦的两者之间是通过命令对象进行沟通的。命令对象封装了接收者和一个或一组动作
3、调用者通过调用命令对象的execute()发出请求,这会使得接收者的动作被调用
*/
public class Test {
public static void main(String[] args) {
//创建接受者
Receiver receiver = new Receiver();
//创建命令对象,并设置它的接受者
Command command = new CreateCommand(receiver);
//创建调用者,将命令对象设置进去
Invoker invoker = new Invoker();
invoker.setCommand(command);
//这里可以测试一下
invoker.runCommand();
invoker.unDoCommand();
}
}