概念
将一个请求封装成一个对象(Command),从而使你可以用不同的请求对客户进行参数化。目的是达到命令的发出者和执行者之间解耦,实现请求和执行分开。
三个角色:
- received:行为实现者,真正的命令执行对象。
- Command:命令类,含有具体接收者成员引用。
- invoker: 行为请求者,利用命令对象成员,为接收者发布命令。
优点:
- 降低了系统耦合度。 分离行为请求者与行为实现者。
- 新的命令可以很容易添加到系统中去。
缺点:
- 使用命令模式可能会导致某些系统有过多的具体命令类。
举例
public class Client {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command myCommand1 = new MyCommand1(receiver);
Command myCommand2 = new MyCommand2(receiver);
Invoker invoker = new Invoker(myCommand1);
invoker.action();
invoker = new Invoker(myCommand2);
invoker.action();
}
}
interface Command {
public void execute();
}
class Invoker {
// 创建命令发出者,并给予一个命令对象
private Command command;
public Invoker(Command command) {
this.command = command;
}
public void action() {
command.execute();
}
}
class Receiver {
public void action1() {
System.out.println("action1");
}
public void action2() {
System.out.println("action2");
}
}
class MyCommand1 implements Command {
private Receiver receiver;
public MyCommand1(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
receiver.action1();
}
}
class MyCommand2 implements Command {
private Receiver receiver;
public MyCommand2(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
receiver.action2();
}
}
Output:
action1
action2