把命令请求和命令执行解耦,关键是抽象出Command接口。
// 命令模式
public class Test7 {
public static void main(String[] args) {
// 客户端负责指定命令的接受者
Command c1 = new ConcreteCommand(new ConcreteReceiver1());
// 请求者
Invoker invoker = new Invoker(c1);
// 执行命令
invoker.runCommand();
Command c2 = new ConcreteCommand(new ConcreteReceiver2());
invoker.setCommand(c2);
invoker.runCommand();
}
}
// 命令请求者。持有命令的集合。
class Invoker {
private Command c;
public Invoker(Command c) {
this.c = c;
}
public void setCommand(Command c) {
this.c = c;
}
public void runCommand() {
c.execute();
}
}
interface Command {
void execute();
}
// 在命令对象里面封装了命令执行者即Receiver
// 命令对象本身不执行具体的操作,而是交给Receiver去执行
abstract class AbstractCommand implements Command {
private Receiver receiver;
public AbstractCommand (Receiver receiver) {
this.receiver = receiver;
}
public Receiver getReceiver() {
return receiver;
}
}
class ConcreteCommand extends AbstractCommand {
public ConcreteCommand (Receiver receiver) {
super(receiver);
}
public void execute(){
getReceiver().action();
}
}
// 命令接受者
interface Receiver {
// 业务方法
void action();
}
class ConcreteReceiver1 implements Receiver {
public void action() {
System.out.println("ConcreteReceiver1 action.... ");
}
}
class ConcreteReceiver2 implements Receiver {
public void action() {
System.out.println("ConcreteReceiver2 action.... ");
}
}