- 一、導(dǎo)語(yǔ)
- 二、怎么用
1.樣例背景
2.UML類(lèi)圖
3.代碼示例- 三、優(yōu)缺點(diǎn)
- 四、使用場(chǎng)景
1.概括描述
2.現(xiàn)存知名產(chǎn)品中的使用示例- 五、相關(guān)設(shè)計(jì)模式
- 六、參考
一、導(dǎo)語(yǔ)
命令模式(Command),將一個(gè)請(qǐng)求封裝成一個(gè)對(duì)象,以便使用不同的請(qǐng)求。
命令模式解決了應(yīng)用程序中對(duì)象的職責(zé)以及他們之間的通信方式。

命令模式的優(yōu)點(diǎn)及使用原則
二、怎么用
共有2個(gè)示例,代碼詳見(jiàn)訪問(wèn)鏈接
下面以example2舉例說(shuō)明
1. 樣例背景
模擬顧客去燒烤店吃燒烤的例子
2. UML類(lèi)圖
ACommand ---------------------------------- 抽象的命令類(lèi)
BakeChickenWingCommand ------------------ 實(shí)際烤雞翅的命令類(lèi)
BakeMuttonCommand ------------------------ 實(shí)際烤羊肉串的命令類(lèi)
Barbecuer ------------------------------------ 燒烤命令的直接執(zhí)行者
Waiter ---------------------------------------- 點(diǎn)菜的服務(wù)員

example2 使用命令模式后 UML類(lèi)圖
3. 代碼示例
/**
* description: 命令模式的抽象類(lèi)
*/
public abstract class ACommand {
protected Barbecuer barbecuer;
public ACommand(Barbecuer barbecuer) {
this.barbecuer = barbecuer;
}
abstract void executeCommand();
}
/**
* description: 烤雞翅的具體命令
*/
public class BakeChickenWingCommand extends ACommand {
public BakeChickenWingCommand(Barbecuer barbecuer) {
super(barbecuer);
}
@Override
void executeCommand() {
barbecuer.bakeChickenWing();
}
}
/**
* description: 具體的烤羊肉串的類(lèi)
*/
public class BakeMuttonCommand extends ACommand {
public BakeMuttonCommand(Barbecuer barbecuer) {
super(barbecuer);
}
@Override
void executeCommand() {
barbecuer.bakeMutton();
}
}
/**
* description: 燒烤師傅
*/
public class Barbecuer {
public void bakeMutton(){
System.out.println("烤羊肉串");
}
public void bakeChickenWing(){
System.out.println("烤雞翅");
}
}
/**
* description: 服務(wù)員類(lèi)
*/
public class Waiter {
private List<ACommand> commandList = new ArrayList<>();
public void setOrder(ACommand command) {
commandList.add(command);
}
public void cancelOrder(ACommand command) {
commandList.remove(command);
}
public void executeAllCommand() {
for (ACommand command : commandList) {
command.executeCommand();
}
commandList.clear();
}
}
public class Test {
public static void main(String[] args) {
Barbecuer barbecuer = new Barbecuer();
ACommand bakeMuttonCommand1 = new BakeMuttonCommand(barbecuer);
ACommand bakeMuttonCommand2 = new BakeMuttonCommand(barbecuer);
ACommand bakeChickenWingCommand = new BakeChickenWingCommand(barbecuer);
Waiter girl = new Waiter();
girl.setOrder(bakeMuttonCommand1);
girl.setOrder(bakeMuttonCommand2);
girl.setOrder(bakeChickenWingCommand);
girl.executeAllCommand();
}
}
執(zhí)行結(jié)果
烤羊肉串
烤羊肉串
烤雞翅
三、優(yōu)缺點(diǎn)
缺點(diǎn)
1.命令的無(wú)限擴(kuò)展會(huì)增加類(lèi)的數(shù)量,提高系統(tǒng)實(shí)現(xiàn)復(fù)雜度優(yōu)點(diǎn)
1.降低耦合
2.容易擴(kuò)展新命令或者一組命令
四、使用場(chǎng)景
1. 概括描述
- 請(qǐng)求的調(diào)用者和請(qǐng)求的接收者需要解耦,使調(diào)用者和接收者不直接交互
- 需要抽象出等待執(zhí)行的行為
2. 現(xiàn)存知名產(chǎn)品中的使用示例 todo
2.1 Runnable (jdk)
2.2 junit.framework.Test (junit)
五、與其他設(shè)計(jì)模式的對(duì)比
1. 命令模式和備忘錄模式
他們兩個(gè)經(jīng)常會(huì)結(jié)合起來(lái)使用,我們可以使用備忘錄模式來(lái)保存命令的歷史記錄,
那這樣的話就可以調(diào)取上一個(gè)命令,或者上上個(gè)命令,這些都是ok的。