1.命令模式简介
命令模式(Command Pattern)模式是是行为型(Behavioral)设计模式,将一个请求(命令)封装成一个对象,从而可以用不同的请求对客户进行参数化,实现请求的发送者和接收者解耦;还可以对请求排队或者记录请求日志,以及支持撤销操作。
命令模式一共有四种角色:
(1) Command(抽象命令类):它定义命令的接口,声明执行的方法execute()
。
(2) ConcreteCommand(具体命令类):是抽象命令类的子类,持有接受者对象,并在执行方法execute()
中调用接受者的相关动作。
(3) Invoker(调用者):调用者即请求发送者,它通过命令对象来执行请求。
(4) Receiver(接收者):接收者执行与请求相关的操作,它具体实现对请求的业务处理。
Invoker(调用者)和 Receiver(接收者)之间通过命令(Command)解耦。
2. 命令模式举例
下面做一个连长命令士兵开火的例子,连长(Captain)下达了开火命令,士兵(Soldier)接收到开火命令,并执行。
序号 | 类名 | 角色 | 说明 |
---|---|---|---|
1 | Command | Command | 抽象命令类 |
2 | FireCommand | ConcreteCommand | 具体命令类,开火命令 |
3 | Captain | Invoker | 调用者,上尉连长 |
4 | Soldier | Receiver | 接收者,士兵 |
5 | CommandMain | 客户端 | 演示调用 |
1. 抽象命令类
/**
* 抽象命令类
*/
public interface Command {
void execute();
}
**2. 调用者,上尉连长 **
/**
* 上尉,调用者,是发送命令的一方。
*/
public class Captain {
private Command command;
// 构造器方式
public Captain(Command command) {
this.command = command;
}
// 设值方式
public void setCommand(Command command) {
this.command = command;
}
// 下命令的业务方法,调用命令类的execute()方法
public void invoke() {
System.out.println("上尉类:下达开火命令");
command.execute();
}
}
3. 士兵类,接受命令的一方
/**
* 士兵类,执行者,接受命令的一方。
*/
public class Soldier {
public void fire() {
System.out.println("士兵类:执行命令,开始射击");
}
}
4. 具体命令类,开火命令
/**
* 开火命令,具体命令类
*/
public class FireCommand implements Command {
// 命令接收者。
private Soldier soldier;
public FireCommand(Soldier soldier) {
this.soldier = soldier;
}
@Override
public void execute() {
// 调用命令接受者的业务方法。
soldier.fire();
}
}
5. 演示类
public class CommandMain {
public static void main(String[] args) {
Soldier soldier = new Soldier();
Command command = new FireCommand(soldier);
Captain captain = new Captain(command);
captain.invoke();
}
}
结果输出
上尉类:下达开火命令
士兵类:执行命令,开始射击
3. 总结
命令模式通过命令降低了请求方和接受者这两个对象之间的耦合度;具备良好的扩展性,可以很方便的引入新的命令;也可以把若干命令组装成成一个组合命令。当然,使用命令模式,可能会使得系统中存在着大量的命令类。
(完)