資源描述:
《設(shè)計(jì)模式 - 命令模式》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、設(shè)計(jì)模式讀書筆記-----命令模式在開發(fā)過程中,我可能會(huì)需要向某些對(duì)象發(fā)送一些請(qǐng)求,但是我們不知請(qǐng)求的具體接收者是誰(shuí),也不知道被請(qǐng)求的操作是那個(gè),我們只知道在程序運(yùn)行中指定具體的請(qǐng)求接收者即可。打個(gè)比方,電視遙控器,我們只需要知道按那個(gè)按鈕能夠打開電視、關(guān)閉電視和換臺(tái)即可,并不需要知道是怎么開電視、關(guān)電視和換臺(tái)的。對(duì)于這種情況,我們可以采用命令模式來進(jìn)行設(shè)計(jì)。一、基本定義命令模式將請(qǐng)求封裝成對(duì)象,以便使用不同的請(qǐng)求、隊(duì)列或者日志來參數(shù)化其他對(duì)象。命令模式支持可撤銷的操作。命令模式可以對(duì)發(fā)送者額接受者完全解耦,發(fā)送者也接收者之間并沒有直接的聯(lián)系,發(fā)送者只需要知道如何發(fā)送請(qǐng)
2、求,不需要關(guān)心請(qǐng)求是如何完成了。這就是命令模式,命令模式將方法調(diào)用給封裝起來了。二、模式結(jié)構(gòu)從上圖可以看出命令模式包含如下幾個(gè)角色:Command:抽象命令類ConcreteCommand:具體命令類Invoker:調(diào)用者Receiver:接收者Client:客戶類命令模式的本質(zhì)就在于將命令進(jìn)行封裝,將發(fā)出命令的責(zé)任和執(zhí)行命令的責(zé)任分開,是的發(fā)送者只需要知道如何發(fā)送命令即可,不需要命令是如何實(shí)現(xiàn)的,甚至命令執(zhí)行是否成功都不需要理會(huì)。同時(shí)命令模式使得請(qǐng)求也變成了一個(gè)對(duì)象,它像其他對(duì)象一樣可以被存儲(chǔ)和傳遞。三、模式實(shí)現(xiàn)這里以電視機(jī)為例。電視劇是請(qǐng)求的接受者,遙控器是請(qǐng)求的發(fā)
3、送者,遙控器上有一些按鈕,不同的按鈕對(duì)應(yīng)著不同的操作。在這里遙控器需要執(zhí)行三個(gè)命令:打開電視機(jī)、關(guān)閉電視機(jī)、換臺(tái)。UML圖:代碼的實(shí)現(xiàn)抽象命令類:Command.java1/**2*Command命令接口,為所有的命令聲明一個(gè)接口。所有的命令都應(yīng)該實(shí)現(xiàn)它3*/4publicinterfaceCommand{5publicvoidexecute();6}電視機(jī)類:Television.java1publicclassTelevision{2publicvoidopen(){3System.out.println("打開電視機(jī)......");4}56publicvoidc
4、lose(){7System.out.println("關(guān)閉電視機(jī)......");8}910publicvoidchangeChannel(){1112System.out.println("切換電視頻道......");13}14}遙控器類:Controller.java1publicclassController{2privateCommandopenTVCommand;3privateCommandcloseTVCommand;4privateCommandchangeChannelCommand;56publicController(CommandopenTv
5、Command,CommandcloseTvCommand,CommandchangeChannelCommand){7this.openTVCommand=openTvCommand;8this.closeTVCommand=closeTvCommand;9this.changeChannelCommand=changeChannelCommand;10}1112/**13*打開電視劇14*/15publicvoidopen(){16openTVCommand.execute();17}1819/**20*關(guān)閉電視機(jī)21*/22publicvoidclose(){23
6、closeTVCommand.execute();24}2526/**27*換頻道28*/29publicvoidchange(){3031changeChannelCommand.execute();32}3334}遙控器的三個(gè)按鈕1publicclassOpenTvCommandimplementsCommand{2privateTelevisiontv;34publicOpenTvCommand(){5tv=newTelevision();6}78publicvoidexecute(){9tv.open();10}1112}1publicclassChangeCh
7、annelCommandimplementsCommand{2privateTelevisiontv;34publicChangeChannelCommand(){5tv=newTelevision();6}78publicvoidexecute(){9tv.changeChannel();10}1112}1publicclassCloseTvCommandimplementsCommand{2privateTelevisiontv;34publicCloseTvCommand(){5tv=newTelevision();6}78publ