說(shuō)明
命令模式(Command Pattern)是一種行為設(shè)計(jì)模式,它將請(qǐng)求封裝為一個(gè)對(duì)象,以便在不同的請(qǐng)求者和接收者之間進(jìn)行解耦、參數(shù)化和操作的隊(duì)列化。命令模式允許你將具體的請(qǐng)求封裝為對(duì)象,這些對(duì)象之間彼此獨(dú)立,并且可以用不同的請(qǐng)求對(duì)客戶端進(jìn)行參數(shù)化。
結(jié)構(gòu)
- 命令接口(Command):聲明執(zhí)行命令的方法。
- 具體命令類(Concrete Command):實(shí)現(xiàn)命令接口,負(fù)責(zé)執(zhí)行具體的操作。
- 接收者類(Receiver):包含了具體的操作方法,由具體命令類調(diào)用。
- 請(qǐng)求者類(Invoker):持有命令對(duì)象,并在需要時(shí)調(diào)用命令的執(zhí)行方法。
工作原理
- 創(chuàng)建命令接口,并聲明執(zhí)行命令的方法,如
execute()
。 - 創(chuàng)建具體命令類,實(shí)現(xiàn)命令接口,并在
execute()
方法中調(diào)用接收者類的具體操作方法。 - 創(chuàng)建接收者類,包含了具體的操作方法。
- 創(chuàng)建請(qǐng)求者類,持有命令對(duì)象,在需要時(shí)調(diào)用命令的
execute()
方法。
優(yōu)點(diǎn)
- 解耦請(qǐng)求者和接收者:命令模式將請(qǐng)求者和接收者之間解耦,使得它們可以獨(dú)立變化,互不影響。
- 可擴(kuò)展性:可以輕松添加新的命令類和接收者類,而不會(huì)影響已有的代碼。
- 可撤銷操作:可以通過(guò)維護(hù)一個(gè)命令歷史棧,實(shí)現(xiàn)對(duì)命令的撤銷和重做。
缺點(diǎn)
- 增加了類和對(duì)象的數(shù)量:引入命令對(duì)象和接收者類,會(huì)增加系統(tǒng)中的類和對(duì)象的數(shù)量。
- 代碼結(jié)構(gòu)復(fù)雜化:使用命令模式需要定義許多新的類和接口,因此會(huì)增加代碼結(jié)構(gòu)的復(fù)雜性。
使用場(chǎng)景
- 需要將請(qǐng)求者和接收者解耦,以便能夠在不同的請(qǐng)求者和接收者之間進(jìn)行靈活的變動(dòng)和組合。
- 需要支持撤銷操作。
- 需要將一系列的操作隊(duì)列化,即可以將命令對(duì)象存儲(chǔ)在列表中,并按順序執(zhí)行。
示例
下面以一個(gè)簡(jiǎn)單的股票交易系統(tǒng)為例,介紹命令模式的應(yīng)用。
假設(shè)我們有一個(gè)股票交易系統(tǒng),我們希望實(shí)現(xiàn)以下功能:
- 可以買入股票(BuyStock命令)。
- 可以賣出股票(SellStock命令)。
- 可以撤銷上一次的交易操作(Undo命令)。
首先,我們定義命令接口Command
,聲明了一個(gè)execute()
方法:
public interface Command {
void execute();
}
然后,我們創(chuàng)建具體的買入股票命令BuyStockCommand
,實(shí)現(xiàn)了Command
接口:
public class BuyStockCommand implements Command {
private StockTrade stockTrade;
public BuyStockCommand(StockTrade stockTrade) {
this.stockTrade = stockTrade;
}
public void execute() {
stockTrade.buy();
}
}
再創(chuàng)建具體的賣出股票命令SellStockCommand
,同樣實(shí)現(xiàn)了Command
接口:
public class SellStockCommand implements Command {
private StockTrade stockTrade;
public SellStockCommand(StockTrade stockTrade) {
this.stockTrade = stockTrade;
}
public void execute() {
stockTrade.sell();
}
}
接下來(lái),我們創(chuàng)建股票交易類StockTrade
,它包含了具體的買入和賣出操作:
public class StockTrade {
public void buy() {
System.out.println("買入股票");
}
public void sell() {
System.out.println("賣出股票");
}
}
最后,我們創(chuàng)建請(qǐng)求者類StockBroker
,它持有命令對(duì)象,并在需要時(shí)調(diào)用命令的execute()
方法:
public class StockBroker {
private Command buyStockCommand;
private Command sellStockCommand;
private Command undoCommand;
public StockBroker(Command buyStockCommand, Command sellStockCommand, Command undoCommand) {
this.buyStockCommand = buyStockCommand;
this.sellStockCommand = sellStockCommand;
this.undoCommand = undoCommand;
}
public void buyStock() {
buyStockCommand.execute();
}
public void sellStock() {
sellStockCommand.execute();
}
public void undo() {
undoCommand.execute();
}
}
現(xiàn)在,我們可以創(chuàng)建股票交易系統(tǒng)的實(shí)例,并進(jìn)行操作:
public class CommandExample {
public static void main(String[] args) {
// 創(chuàng)建股票交易對(duì)象
StockTrade stockTrade = new StockTrade();
// 創(chuàng)建具體的命令對(duì)象
Command buyStockCommand = new BuyStockCommand(stockTrade);
Command sellStockCommand = new SellStockCommand(stockTrade);
// 創(chuàng)建請(qǐng)求者對(duì)象
StockBroker stockBroker = new StockBroker(buyStockCommand, sellStockCommand, buyStockCommand);
// 執(zhí)行買入操作
stockBroker.buyStock(); // 買入股票
// 執(zhí)行賣出操作
stockBroker.sellStock(); // 賣出股票
// 撤銷操作
stockBroker.undo(); // 買入股票
}
}
運(yùn)行結(jié)果如下:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-618679.html
買入股票
賣出股票
買入股票文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-618679.html
到了這里,關(guān)于【設(shè)計(jì)模式|行為型】命令模式(Command Pattern)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!