前言
Github:https://github.com/yihonglei/java-design-patterns
一 命令模式作用
将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;
对请求排队或者记录请求日志,以及支持可撤销的操作。
命令模式又称为动作(Action)模式或事务(Transaction)模式。
二 应用场景
(1)在不同的时间指定请求、将请求排队和执行请求。
(2)支持命令的撤销(Undo)操作和恢复(Redo)操作。
(3)支持修改日志,当系统崩溃时,这些修改可以被重做一遍。
(4)将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
三 参与对象
(1)Command(抽象命令类)
声明执行操作的接口。调用接收者相应的操作,以实现执行的方法Execute。
(2)ConcreteCommand(具体命令类)
创建一个具体命令对象并设定它的接收者。调用接受者相应的操作,以实现Execute。
(3)Invoker(调用者)
要求该命令执行这个请求。通常会持有命令对象,可以持有很多的命令对象。
(4)Receiver(接收者)
知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者。
(5)Client(客户类)
创建一个具体的命令对象,并且设置命令对象的接收者。
四 实例分析
Command
package com.jpeony.design.patterns.command;
/**
* Command:声明执行操作的接口。调用接收者相应的操作,以实现执行的方法Execute。
*
* @author yihonglei
*/
public abstract class Command {
protected Receiver receiver;
public Command(Receiver receiver) {
this.receiver = receiver;
}
public abstract void execute();
}
ConcreteCommand
package com.jpeony.design.patterns.command;
/**
* ConcreteCommand: 创建一个具体命令对象并设定它的接收者。调用接受者相应的操作,以实现Execute。
*
* @author yihonglei
*/
public class CommandImpl extends Command {
public CommandImpl(Receiver receiver) {
super(receiver);
}
@Override
public void execute() {
receiver.request();
}
}
Invoker
package com.jpeony.design.patterns.command;
/**
* Invoker: 要求该命令执行这个请求。通常会持有命令对象,可以持有很多的命令对象。
*
* @author yihonglei
*/
public class Invoker {
private Command command;
public Command getCommand() {
return command;
}
public void setCommand(Command command) {
this.command = command;
}
public void execute() {
command.execute();
}
}
Receiver
package com.jpeony.design.patterns.command;
/**
* Receiver: 知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者。
*
* @author yihonglei
*/
public class Receiver {
public void request() {
System.out.println("接受者类");
}
}
Client
package com.jpeony.design.patterns.command;
/**
* Client: 创建一个具体的命令对象,并且设置命令对象的接收者。
*
* @author yihonglei
*/
public class Test {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command command = new CommandImpl(receiver);
Invoker invoker = new Invoker();
invoker.setCommand(command);
invoker.execute();// 调用者调用,接受者接受
}
}
运行结果