命令模式是一種行為設(shè)計(jì)模式,它將一個(gè)請求封裝成一個(gè)對象,從而讓你使用不同的請求、隊(duì)列或者請求的日志來參數(shù)化其他對象。它也支持可撤銷的操作。命令模式的關(guān)鍵是引入了抽象層——命令接口,具體命令實(shí)現(xiàn)該接口,執(zhí)行操作的對象從執(zhí)行具體操作的職責(zé)中解耦出來。
使用場景
- 當(dāng)你需要參數(shù)化對象根據(jù)請求來執(zhí)行操作時(shí),可以使用命令模式,因?yàn)樗梢灾付ê蛨?zhí)行請求。
- 當(dāng)你需要在不同的時(shí)間指定、排隊(duì)和執(zhí)行請求時(shí)。命令對象可以在一個(gè)隊(duì)列中排隊(duì),并在稍后執(zhí)行。
- 當(dāng)需要支持撤銷操作時(shí)。命令模式可以將狀態(tài)回滾到某個(gè)命令被執(zhí)行之前的狀態(tài)。
- 當(dāng)你需要將操作組裝成復(fù)雜操作時(shí),可以使用命令模式,它支持組合命令。
好處
- 降低耦合度:命令模式通過引入命令接口,使得請求的發(fā)送者和接收者解耦,增加新的命令很方便,不需要改動舊的代碼。
- 增強(qiáng)可擴(kuò)展性:可以很容易地添加新命令,只需實(shí)現(xiàn)接口即可。
- 支持撤銷操作:可以通過實(shí)現(xiàn)撤銷方法來輕松支持撤銷。
- 可以組合命令:可以將多個(gè)命令組裝成宏命令,一次性執(zhí)行多個(gè)操作。
Java代碼演示
接收者(Receiver)
接收者類Light
實(shí)際執(zhí)行與請求相關(guān)的操作:
public class Light {
public void turnOn() {
System.out.println("Light is on");
}
public void turnOff() {
System.out.println("Light is off");
}
}
命令接口(Command)
命令接口定義了執(zhí)行操作的方法:
public interface Command {
void execute();
}
具體命令(Concrete Commands)
具體命令實(shí)現(xiàn)命令接口,并定義接收者和操作之間的綁定關(guān)系:
public class LightOnCommand implements Command {
private Light light;
public LightOnCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOn();
}
}
public class LightOffCommand implements Command {
private Light light;
public LightOffCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOff();
}
}
調(diào)用者(Invoker)
調(diào)用者持有命令對象,并在某個(gè)時(shí)間點(diǎn)調(diào)用命令對象的execute()
方法:
public class RemoteControl {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void pressButton() {
if (command != null) {
command.execute();
}
}
}
客戶端(Client)
客戶端決定哪個(gè)命令執(zhí)行,以及它的接收者是誰:
public class Client {
public static void main(String[] args) {
// 創(chuàng)建接收者
Light light = new Light();
// 創(chuàng)建命令,并設(shè)置其接收者
Command lightsOn = new LightOnCommand(light);
Command lightsOff = new LightOffCommand(light);
// 創(chuàng)建調(diào)用者,并關(guān)聯(lián)命令
RemoteControl control = new RemoteControl();
control.setCommand(lightsOn); // 設(shè)置開燈命令
control.pressButton(); // 執(zhí)行開燈命令
control.setCommand(lightsOff); // 設(shè)置關(guān)燈命令
control.pressButton(); // 執(zhí)行關(guān)燈命令
}
}
命令模式的好處
通過這個(gè)更完整的示例,我們可以看到命令模式的幾個(gè)關(guān)鍵好處:文章來源:http://www.zghlxwxcb.cn/news/detail-833843.html
-
解耦調(diào)用操作和接收者:
RemoteControl
(調(diào)用者)不直接操作Light
(接收者),而是通過命令對象進(jìn)行間接操作。這意味著Light
類的任何變化都不會直接影響到RemoteControl
類,反之亦然。 -
易于擴(kuò)展:要增加新的命令操作,只需添加一個(gè)新的
Command
實(shí)現(xiàn)即可,無需修改現(xiàn)有的Invoker
或Receiver
類。 - 組合命令:可以很容易地實(shí)現(xiàn)宏命令,即一個(gè)命令觸發(fā)多個(gè)操作。
這樣,使用命令模式提供了代碼的靈活性和擴(kuò)展性,同時(shí)也使得操作的撤銷和重做成為可能。文章來源地址http://www.zghlxwxcb.cn/news/detail-833843.html
到了這里,關(guān)于23種設(shè)計(jì)模式之:命令模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!