[设计模式] 浅谈命令模式
命令模式
模式功能说明:在命令模式中,请求在对象中作为命令来封装,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把命令传给相应的对象,该对象执行命令。
模式思路与原理
- 抽象命令类(Command):声明执行操作的接口。
- 具体命令类(ConcreteCommand):是抽象命令类的实现者,它定义了动作和接收者之间的绑定关系。
- 调用者(Invoker):负责调用命令。
- 接收者(Receiver):接收命令并执行命令。
案例
// 抽象命令类
public interface Command {
void execute();
}
// 具体命令类
public class ConcreteCommand implements Command {
private Receiver receiver;
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
public void execute() {
receiver.action();
}
}
// 调用者
public class Invoker {
private Command command;
public Invoker(Command command) {
this.command = command;
}
public void call() {
command.execute();
}
}
// 接收者
public class Receiver {
public void action() {
System.out.println("执行操作");
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
Invoker invoker = new Invoker(command);
invoker.call();
}
}
Receiver是接收者,执行操作的具体对象。ConcreteCommand是具体命令,它持有一个对Receiver对象的引用,并调用其action方法。Invoker是调用者,它持有一个对Command对象的引用,可以用来执行命令。
使用场景:
- 对请求者和接收者需要解耦,使得调用者和接收者不直接交互。
- 需要抽象出等待执行的操作
优缺点
优点:
- 降低系统的耦合度。
- 新的命令可以很容易地加入到系统中。
缺点:
- 使用命令模式可能会导致某些系统有过多的具体命令类。
总结
模板模式将请求封装为一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。 模板模式它提供了一种将请求和操作解耦的方式,使得请求的发送者和接收者之间没有直接引用。这使得系统更加灵活,能更好地应对变化。