去國外怎么導(dǎo)航地圖搜索引擎關(guān)鍵詞怎么優(yōu)化
目錄
什么是命令模式? ? ?
命令模式的實(shí)現(xiàn)
命令模式角色
命令模式類圖
命令模式舉例
命令模式代碼實(shí)現(xiàn)
命令模式的特點(diǎn)
優(yōu)點(diǎn)
缺點(diǎn)
使用場(chǎng)景
注意事項(xiàng)
什么是命令模式? ? ?
????????命令模式(Command Pattern)是一種數(shù)據(jù)驅(qū)動(dòng)的設(shè)計(jì)模式,它屬于行為型模式。是對(duì)命令的封裝,每一個(gè)命令都是一個(gè)操作,請(qǐng)求以命令的形式包裹在對(duì)象中,并傳給調(diào)用對(duì)象。調(diào)用對(duì)象尋找可以處理該命令的合適的對(duì)象,并把該命令傳給相應(yīng)的對(duì)象,該對(duì)象執(zhí)行命令。
????????在軟件系統(tǒng)中,方法的請(qǐng)求者與方法的實(shí)現(xiàn)者總是存在著緊密的耦合關(guān)系,這不利于擴(kuò)展和維護(hù)。如何將“行為請(qǐng)求者”與“行為實(shí)現(xiàn)者”解耦?將一組行為抽象為對(duì)象,實(shí)現(xiàn)二者之間的松耦合,變得很重要,命令模式能很好地解決這個(gè)問題。
命令模式的實(shí)現(xiàn)
????????命令模式將請(qǐng)求以命令的形式包裹在對(duì)象里面,傳遞給調(diào)用對(duì)象,調(diào)用對(duì)象尋找匹配該命令的對(duì)象,將命令給該對(duì)象執(zhí)行。其調(diào)用過程主要分為了三步:
- 命令被包裹在請(qǐng)求對(duì)象里,傳遞給調(diào)用對(duì)象。
- 調(diào)用對(duì)象查找匹配該命令(可以處理該命令)的對(duì)象,將該命令傳遞給匹配的對(duì)象。
- 該對(duì)象執(zhí)行傳遞給它的命令。
命令模式角色
接收者角色(Receiver):該類負(fù)責(zé)具體實(shí)施或執(zhí)行一個(gè)請(qǐng)求,真正執(zhí)行命令的對(duì)象。任何類都可能成為一個(gè)接收者,只要它能夠?qū)崿F(xiàn)命令要求實(shí)現(xiàn)的相應(yīng)功能。
命令角色(Command):定義需要執(zhí)行的所有命令行為,需要執(zhí)行的命令都在這里聲明。
具體命令角色(ConcreteCommand):命令接口實(shí)現(xiàn)對(duì)象,是“虛”的實(shí)現(xiàn);該類內(nèi)部通常會(huì)持有接收者,并調(diào)用接收者的功能來完成命令要執(zhí)行的操作。
請(qǐng)求者角色(Invoker):接收客戶端的命令,并執(zhí)行命令,要求命令對(duì)象執(zhí)行請(qǐng)求,可以持有很多的命令對(duì)象。是客戶端真正觸發(fā)命令并要求命令執(zhí)行相應(yīng)操作的地方,相當(dāng)于使用命令對(duì)象的入口。
命令模式類圖
命令模式舉例
????????小女孩茱麗(Julia)有一個(gè)盒式錄音機(jī),此錄音機(jī)有播音(Play)、倒帶(Rewind)和停止(Stop)功能,錄音機(jī)的鍵盤便是請(qǐng)求者(Invoker)角色;茱麗(Julia)是客戶端角色,而錄音機(jī)便是接收者角色。Command類扮演抽象命令角色,而PlayCommand、StopCommand和RewindCommand便是具體命令類。茱麗(Julia)不需要知道播音(play)、倒帶(rewind)和停止(stop)功能是怎么具體執(zhí)行的,這些命令執(zhí)行的細(xì)節(jié)全都由鍵盤(Keypad)具體實(shí)施。茱麗(Julia)只需要在鍵盤上按下相應(yīng)的鍵便可以了。
命令模式代碼實(shí)現(xiàn)
接收者角色
package com.common.demo.pattern.command;/*** @author Evan Walker 昂焱數(shù)據(jù): https://www.ayshuju.com* @version 1.0* @desc 接收者角色類* @date 2023/08/01 21:04:50*/
public class AudioPlayer {public void play(){System.out.println("播放...");}public void rewind(){System.out.println("倒帶...");}public void stop(){System.out.println("停止...");}
}
命令角色
package com.common.demo.pattern.command;/*** @author Evan Walker 昂焱數(shù)據(jù): https://www.ayshuju.com* @version 1.0* @desc 抽象命令角色類* @date 2023/08/01 21:04:34*/
public interface Command {/*** 執(zhí)行方法*/void execute();
}
具體命令角色
package com.common.demo.pattern.command;/*** @author Evan Walker 昂焱數(shù)據(jù): https://www.ayshuju.com* @version 1.0* @desc 具體調(diào)用者角色* @date 2023/08/01 21:07:43*/
public class ConcreteCommand implements Command {private Receiver receiver = null;/*** 構(gòu)造方法*/public ConcreteCommand(Receiver receiver) {this.receiver = receiver;}@Overridepublic void execute() {//通常會(huì)轉(zhuǎn)調(diào)接收者對(duì)象的相應(yīng)方法,讓接收者來真正執(zhí)行功能receiver.action();}
}
package com.common.demo.pattern.command;/*** @author Evan Walker 昂焱數(shù)據(jù): https://www.ayshuju.com* @version 1.0* @desc 具體調(diào)用者角色 倒帶* @date 2023/08/01 21:07:43*/
public class RewindCommand implements Command {private AudioPlayer audioPlayer= null;/*** 構(gòu)造方法*/public RewindCommand(AudioPlayer audioPlayer) {this.audioPlayer = audioPlayer;}@Overridepublic void execute() {//通常會(huì)轉(zhuǎn)調(diào)接收者對(duì)象的相應(yīng)方法,讓接收者來真正執(zhí)行功能audioPlayer.rewind();}
}
package com.common.demo.pattern.command;/*** @author Evan Walker 昂焱數(shù)據(jù): https://www.ayshuju.com* @version 1.0* @desc 具體調(diào)用者角色 暫停* @date 2023/08/01 21:07:43*/
public class StopCommand implements Command {private AudioPlayer audioPlayer= null;/*** 構(gòu)造方法*/public StopCommand(AudioPlayer audioPlayer) {this.audioPlayer = audioPlayer;}@Overridepublic void execute() {//通常會(huì)轉(zhuǎn)調(diào)接收者對(duì)象的相應(yīng)方法,讓接收者來真正執(zhí)行功能audioPlayer.stop();}
}
請(qǐng)求者角色
package com.common.demo.pattern.command;/*** @author Evan Walker 昂焱數(shù)據(jù): https://www.ayshuju.com* @version 1.0* @desc 請(qǐng)求者角色 按鍵* @date 2023/08/01 21:09:32*/
public class Keypad {private Command playCommand;private Command rewindCommand;private Command stopCommand;public void setPlayCommand(Command playCommand) {this.playCommand = playCommand;}public void setRewindCommand(Command rewindCommand) {this.rewindCommand = rewindCommand;}public void setStopCommand(Command stopCommand) {this.stopCommand = stopCommand;}/*** 執(zhí)行播放方法*/public void play(){playCommand.execute();}/*** 執(zhí)行倒帶方法*/public void rewind(){rewindCommand.execute();}/*** 執(zhí)行播放方法*/public void stop(){stopCommand.execute();}
}
測(cè)試代碼
package com.common.demo.pattern.command;/*** @author Evan Walker 昂焱數(shù)據(jù): https://www.ayshuju.com* @version 1.0* @desc 客戶端測(cè)試類 客戶judia* @date 2023/08/01 21:10:30*/
public class ClientTest {public static void main(String[] args) {//創(chuàng)建接收者對(duì)象AudioPlayer audioPlayer = new AudioPlayer();//創(chuàng)建命令對(duì)象Command playCommand = new PlayCommand(audioPlayer);Command rewindCommand = new RewindCommand(audioPlayer);Command stopCommand = new StopCommand(audioPlayer);//創(chuàng)建請(qǐng)求者對(duì)象Keypad keypad = new Keypad();keypad.setPlayCommand(playCommand);keypad.setRewindCommand(rewindCommand);keypad.setStopCommand(stopCommand);//測(cè)試keypad.play();keypad.rewind();keypad.stop();keypad.play();keypad.stop();}
}
測(cè)試截圖
命令模式的特點(diǎn)
優(yōu)點(diǎn)
- 解耦性:解耦請(qǐng)求發(fā)送者和接收者,命令模式將請(qǐng)求封裝成獨(dú)立的命令對(duì)象,使得發(fā)送者和接收者之間解耦,從而降低了兩者之間的直接依賴關(guān)系。
- 易擴(kuò)展性:容易擴(kuò)展新的命令,由于命令被封裝成獨(dú)立的對(duì)象,可以很容易地?cái)U(kuò)展新的命令類,而無需修改現(xiàn)有的代碼。
- 動(dòng)態(tài)組合性:命令模式把請(qǐng)求封裝起來,可以動(dòng)態(tài)地對(duì)它進(jìn)行參數(shù)化、隊(duì)列化和日志化等操作,從而使得系統(tǒng)更靈活。命令模式中的命令對(duì)象能夠很容易地組合成復(fù)合命令,也就是宏命令,從而使系統(tǒng)操作更簡(jiǎn)單,功能更強(qiáng)大。
缺點(diǎn)
- 類膨脹:每個(gè)具體命令都需要一個(gè)獨(dú)立的類,如果命令過多,可能導(dǎo)致類的數(shù)量劇增,增加了系統(tǒng)復(fù)雜性。
- 實(shí)現(xiàn)復(fù)雜:命令模式的實(shí)現(xiàn)可能比較復(fù)雜,涉及到許多額外的類和關(guān)聯(lián)關(guān)系。
- 可能造成性能瓶頸:若系統(tǒng)中存在大量的命令對(duì)象,執(zhí)行這些命令可能會(huì)對(duì)系統(tǒng)的性能造成影響。其命令是通過一個(gè)個(gè)對(duì)象來完成的,在執(zhí)行命令時(shí)可能需要執(zhí)行大量的對(duì)象,這可能會(huì)帶來一定的時(shí)間開銷。
使用場(chǎng)景
- 需要將請(qǐng)求發(fā)送者和接收者解耦的情況。
- 需要支持撤銷和重做操作的場(chǎng)景。
- 需要將一系列操作封裝成一個(gè)命令進(jìn)行批處理的情況。
- 需要支持日志和事務(wù)等功能的情況。
注意事項(xiàng)
- 命令對(duì)象要盡量保持簡(jiǎn)單,只包含必要的信息,以減輕命令的負(fù)擔(dān)和復(fù)雜度。
- 注意命令模式中對(duì)象間的引用關(guān)系。命令對(duì)象通常需要持有對(duì)接收者的引用,可以通過構(gòu)造函數(shù)或?qū)傩宰⑷敕绞綄?shí)現(xiàn)。
- 考慮使用撤銷和重做操作時(shí),需要合理地管理命令的歷史記錄,以便正確地執(zhí)行撤銷和重做操作。
- 注意命令模式的適用場(chǎng)景,避免過度設(shè)計(jì)和濫用命令模式帶來的額外復(fù)雜性。
更多消息資訊,請(qǐng)?jiān)L問昂焱數(shù)據(jù)(https://www.ayshuju.com)