1.命令模式簡介
命令模式(Command Pattern)模式是是行為型(Behavioral)設(shè)計(jì)模式姊扔,將一個(gè)請(qǐng)求(命令)封裝成一個(gè)對(duì)象盛杰,從而可以用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化忠烛,實(shí)現(xiàn)請(qǐng)求的發(fā)送者和接收者解耦;還可以對(duì)請(qǐng)求排隊(duì)或者記錄請(qǐng)求日志禁舷,以及支持撤銷操作男娄。
命令模式一共有四種角色:
(1) Command(抽象命令類):它定義命令的接口,聲明執(zhí)行的方法execute()
十艾。
(2) ConcreteCommand(具體命令類):是抽象命令類的子類玉锌,持有接受者對(duì)象,并在執(zhí)行方法execute()
中調(diào)用接受者的相關(guān)動(dòng)作疟羹。
(3) Invoker(調(diào)用者):調(diào)用者即請(qǐng)求發(fā)送者,它通過命令對(duì)象來執(zhí)行請(qǐng)求禀倔。
(4) Receiver(接收者):接收者執(zhí)行與請(qǐng)求相關(guān)的操作榄融,它具體實(shí)現(xiàn)對(duì)請(qǐng)求的業(yè)務(wù)處理。
Invoker(調(diào)用者)和 Receiver(接收者)之間通過命令(Command)解耦救湖。
2. 命令模式舉例
下面做一個(gè)連長命令士兵開火的例子愧杯,連長(Captain)下達(dá)了開火命令,士兵(Soldier)接收到開火命令鞋既,并執(zhí)行力九。
序號(hào) | 類名 | 角色 | 說明 |
---|---|---|---|
1 | Command | Command | 抽象命令類 |
2 | FireCommand | ConcreteCommand | 具體命令類耍铜,開火命令 |
3 | Captain | Invoker | 調(diào)用者,上尉連長 |
4 | Soldier | Receiver | 接收者跌前,士兵 |
5 | CommandMain | 客戶端 | 演示調(diào)用 |
1. 抽象命令類
/**
* 抽象命令類
*/
public interface Command {
void execute();
}
**2. 調(diào)用者棕兼,上尉連長 **
/**
* 上尉,調(diào)用者抵乓,是發(fā)送命令的一方伴挚。
*/
public class Captain {
private Command command;
// 構(gòu)造器方式
public Captain(Command command) {
this.command = command;
}
// 設(shè)值方式
public void setCommand(Command command) {
this.command = command;
}
// 下命令的業(yè)務(wù)方法,調(diào)用命令類的execute()方法
public void invoke() {
System.out.println("上尉類:下達(dá)開火命令");
command.execute();
}
}
3. 士兵類灾炭,接受命令的一方
/**
* 士兵類茎芋,執(zhí)行者,接受命令的一方蜈出。
*/
public class Soldier {
public void fire() {
System.out.println("士兵類:執(zhí)行命令田弥,開始射擊");
}
}
4. 具體命令類,開火命令
/**
* 開火命令铡原,具體命令類
*/
public class FireCommand implements Command {
// 命令接收者偷厦。
private Soldier soldier;
public FireCommand(Soldier soldier) {
this.soldier = soldier;
}
@Override
public void execute() {
// 調(diào)用命令接受者的業(yè)務(wù)方法。
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();
}
}
結(jié)果輸出
上尉類:下達(dá)開火命令
士兵類:執(zhí)行命令眷蜈,開始射擊
3. 總結(jié)
命令模式通過命令降低了請(qǐng)求方和接受者這兩個(gè)對(duì)象之間的耦合度沪哺;具備良好的擴(kuò)展性,可以很方便的引入新的命令酌儒;也可以把若干命令組裝成成一個(gè)組合命令辜妓。當(dāng)然,使用命令模式忌怎,可能會(huì)使得系統(tǒng)中存在著大量的命令類籍滴。
(完)