命令模式
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化。
类结构图
Invoker
要求该命令执行这个请求。
Command
用来声明执行命令的接口。
ConcreteCommand
将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现 Execute。
Receiver
就是接收命令的角色具体实施一个请求的操作,任何类都可能作为一个接收者。
代码示例
这样就好比我们去饭馆吃饭。
Receiver 就是具体处理我们命令的人好比厨师.
Command 就像我们点菜的命令。
Invoker 就好比服务员。我们来实现一下。
public interface Command {
void setReceiver(Receiver receiver);
String getContent();
void execute(Command command);
}
public interface Receiver {
void action(Command command);
}
public class ConcreteReceiver implements Receiver {
@Override
public void action(Command command) {
System.out.println("厨师 ConcreteReceiver 正在执行 " + command.getContent());
}
}
public class Waiter {
private List<Command> commands = new ArrayList();
public void addCommand(Command command) {
this.commands.add(command);
}
public void delCommand(Command command) {
this.commands.remove(command);
}
public void executeCommand() {
for (Command c : commands) {
c.execute(c);
}
}
}
客户端示例
public class Client {
public static void main(String[] args) {
Receiver receiver = new ConcreteReceiver();
Command command = new Command() {
private Receiver receiver;
@Override
public void setReceiver(Receiver receiver) {
this.receiver = receiver;
}
@Override
public String getContent() {
return "西红柿炒鸡蛋!";
}
@Override
public void execute() {
this.receiver.action(this);
}
};
command.setReceiver(receiver);
Waiter waiter = new Waiter();
waiter.addCommand(command);
waiter.executeCommand();
}
}
运行结果
厨师 ConcreteReceiver 正在执行 西红柿炒鸡蛋!
Process finished with exit code 0
优点
代码解耦,调用者和接收者没有依赖关系,只需要了解到对应的 Command 即可不需要了解谁去做这个菜,怎么做这个菜。
缺点
类会变得很多,如果一个操作需要很多命令在一起,那么就需要实例化 N 个 Command 实现类。