摘要:要點(diǎn)命令模式將發(fā)出請(qǐng)求的對(duì)象和執(zhí)行請(qǐng)求的對(duì)象解耦。感謝你看到這里,命令模式到這里就結(jié)束了,本人文筆隨便,若有不足或錯(cuò)誤之處望給予指點(diǎn),度彎腰很快我會(huì)發(fā)布下一個(gè)設(shè)計(jì)模式的內(nèi)容,生命不息,編程不止
繼續(xù)上部分的說
在之前的文章最后寫了一個(gè)帶有撤銷電燈功能的遙控器功能,通常,想要實(shí)現(xiàn)撤銷的功能,需要記錄撤銷之前的狀態(tài)是什么,就比方說電扇,允許有多個(gè)風(fēng)速狀態(tài),也允許被關(guān)閉。
直接上代碼。
1、風(fēng)扇類
package CeilingFan; /** * 使用狀態(tài)實(shí)現(xiàn)撤銷 * 風(fēng)扇類 * @author Joy * */ public class CeilingFan { public static final int HIGH = 3; public static final int MEDIUM = 2; public static final int LOW = 1; public static final int OFF = 0; String location; int speed; public CeilingFan(String location) { this.location = location; } // 高轉(zhuǎn)速 public void high() { speed = HIGH; System.out.println(location+"風(fēng)扇正在高轉(zhuǎn)速運(yùn)行"); } // 中轉(zhuǎn)速 public void medium() { speed = MEDIUM; System.out.println(location+"風(fēng)扇正在中轉(zhuǎn)速運(yùn)行"); } // 低轉(zhuǎn)速 public void low() { speed = LOW; System.out.println(location+"風(fēng)扇正在低轉(zhuǎn)速運(yùn)行"); } // 關(guān)閉吊扇 public void off() { speed = OFF; System.out.println(location+"風(fēng)扇關(guān)閉"); } //獲取當(dāng)前吊扇速度 public int getSpeed(){ return speed; } }
2、命令類
package CeilingFan; public interface Command { public void execute(); public void undo(); }
3、下面是風(fēng)扇高、中、低關(guān)閉的具體實(shí)現(xiàn)類
package CeilingFan; /** * 風(fēng)扇高速操作 * * @author Joy * */ public class CeilingFanHighCommand implements Command { CeilingFan ceilingFan; int prevSpeed; public CeilingFanHighCommand(CeilingFan ceilingFan) { this.ceilingFan = ceilingFan; } // 執(zhí)行 @Override public void execute() { // 執(zhí)行方法前,先獲取之前的狀態(tài)并記錄下來 prevSpeed = ceilingFan.getSpeed(); ceilingFan.high(); } // 撤銷 @Override public void undo() { // 將風(fēng)扇的速度設(shè)置為之前的狀態(tài),達(dá)到撤銷目的 switch (prevSpeed) { case CeilingFan.HIGH: ceilingFan.high(); break; case CeilingFan.MEDIUM: ceilingFan.medium(); break; case CeilingFan.LOW: ceilingFan.low(); break; case CeilingFan.OFF: ceilingFan.off(); break; } } }
package CeilingFan; /** * 風(fēng)扇中速操作 * @author Joy * */ public class CeilingFanMediumCommand implements Command { CeilingFan ceilingFan; int prevSpeed; public CeilingFanMediumCommand(CeilingFan ceilingFan) { this.ceilingFan = ceilingFan; } public void execute() { prevSpeed = ceilingFan.getSpeed(); ceilingFan.medium(); } public void undo() { switch (prevSpeed) { case CeilingFan.HIGH: ceilingFan.high(); break; case CeilingFan.MEDIUM: ceilingFan.medium(); break; case CeilingFan.LOW: ceilingFan.low(); break; default: ceilingFan.off(); break; } } }
package CeilingFan; /** * 風(fēng)扇低速操作 * @author Joy * */ public class CeilingFanLowCommand implements Command { CeilingFan ceilingFan; int prevSpeed; public CeilingFanLowCommand(CeilingFan ceilingFan) { this.ceilingFan = ceilingFan; } @Override public void execute() { prevSpeed = ceilingFan.getSpeed(); ceilingFan.low(); } @Override public void undo() { switch (prevSpeed) { case CeilingFan.HIGH: ceilingFan.high(); break; case CeilingFan.MEDIUM: ceilingFan.medium(); break; case CeilingFan.LOW: ceilingFan.low(); break; default: ceilingFan.off(); break; } } }
package CeilingFan; /** * 風(fēng)扇關(guān)閉 * @author Joy * */ public class CeilingFanOffCommand implements Command { CeilingFan ceilingFan; int prevSpeed; public CeilingFanOffCommand(CeilingFan ceilingFan) { this.ceilingFan = ceilingFan; } public void execute() { prevSpeed = ceilingFan.getSpeed(); ceilingFan.off(); } public void undo() { switch (prevSpeed) { case CeilingFan.HIGH: ceilingFan.high(); break; case CeilingFan.MEDIUM: ceilingFan.medium(); break; case CeilingFan.LOW: ceilingFan.low(); break; default: ceilingFan.off(); break; } } }
4、無操作類接口
package CeilingFan; public class NoCommand implements Command { public void execute() { } public void undo() { } }
5、調(diào)用者
package CeilingFan; /** * 調(diào)用者 * @author Joy * */ public class RemoteControlWithUndo { Command[] onCommands; Command[] offCommands; Command undoCommand; public RemoteControlWithUndo() { onCommands = new Command[7]; offCommands = new Command[7]; Command noCommand = new NoCommand(); for(int i=0;i<7;i++) { onCommands[i] = noCommand; offCommands[i] = noCommand; } undoCommand = noCommand; } public void setCommand(int slot, Command onCommand, Command offCommand) { onCommands[slot] = onCommand; offCommands[slot] = offCommand; } public void onButtonWasPushed(int slot) { onCommands[slot].execute(); undoCommand = onCommands[slot]; } public void offButtonWasPushed(int slot) { offCommands[slot].execute(); undoCommand = offCommands[slot]; } public void undoButtonWasPushed() { undoCommand.undo(); } public String toString() { StringBuffer stringBuff = new StringBuffer(); stringBuff.append(" ------ 遙控器 ------- "); for (int i = 0; i < onCommands.length; i++) { stringBuff.append("[插槽 " + i + "] " + onCommands[i].getClass().getName() + " " + offCommands[i].getClass().getName() + " "); } stringBuff.append("[撤銷] " + undoCommand.getClass().getName() + " "); return stringBuff.toString(); } }
6、測(cè)試類
package CeilingFan; public class TestMain { public static void main(String[] args) { //實(shí)例化遙控器 RemoteControlWithUndo remoteControl=new RemoteControlWithUndo(); CeilingFan ceilingFan=new CeilingFan("臥室"); //這里高中低速 關(guān)閉分別實(shí)例化 CeilingFanHighCommand highCommand=new CeilingFanHighCommand(ceilingFan); CeilingFanMediumCommand mediumCommand=new CeilingFanMediumCommand(ceilingFan); CeilingFanLowCommand lowCommand=new CeilingFanLowCommand(ceilingFan); CeilingFanOffCommand offCommand=new CeilingFanOffCommand(ceilingFan); //遙控器加載中速和高速的開啟和關(guān)閉方法 remoteControl.setCommand(0, mediumCommand, offCommand); remoteControl.setCommand(1, highCommand, offCommand); //先以中速開啟吊扇 remoteControl.onButtonWasPushed(0); //關(guān)閉吊扇 remoteControl.offButtonWasPushed(0); //顯示插槽調(diào)用信息 System.out.println(remoteControl.toString()); //撤銷,會(huì)變?yōu)橹兴? remoteControl.undoButtonWasPushed(); remoteControl.onButtonWasPushed(1); System.out.println(remoteControl.toString()); remoteControl.undoButtonWasPushed(); } }
7、效果圖
其實(shí)命令模式還能用于宏命令,隊(duì)列請(qǐng)求,日志請(qǐng)求,命令模式我理解的很一般,往后我還會(huì)補(bǔ)充修改此篇內(nèi)容。
要點(diǎn):
1:命令模式將發(fā)出請(qǐng)求的對(duì)象和執(zhí)行請(qǐng)求的對(duì)象解耦。
2:被解耦的兩者之間是通過命令對(duì)象進(jìn)行溝通的。命令對(duì)象封裝了接收者和一個(gè)或一組對(duì)象
3:調(diào)用者通過調(diào)用命令對(duì)象的execute方法發(fā)出請(qǐng)求,這會(huì)使得的接收者的動(dòng)作被調(diào)用。
4:命令可以支持撤銷動(dòng)作,實(shí)現(xiàn)一個(gè)undo方法來回到execute被執(zhí)行前的狀態(tài)。
感謝你看到這里,命令模式到這里就結(jié)束了,本人文筆隨便,若有不足或錯(cuò)誤之處望給予指點(diǎn),90度彎腰~~~很快我會(huì)發(fā)布下一個(gè)設(shè)計(jì)模式的內(nèi)容,生命不息,編程不止!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/70335.html
摘要:好的,我重新繪制了一張圖反映命令模式如下圖,流程與上圖相同。感謝你看到這里,命令模式的上部分到這里就結(jié)束了,本人文筆隨便,若有不足或錯(cuò)誤之處望給予指點(diǎn),度彎腰很快我會(huì)發(fā)布命令模式下的內(nèi)容,生命不息,編程不止參考書籍設(shè)計(jì)模式 封裝調(diào)用:將方法調(diào)用給封裝起來。 這次講的是命令模式,他的作用就是方法給封裝起來,有需要的時(shí)候就調(diào)用,調(diào)用者并不需要關(guān)心它是如何實(shí)現(xiàn)的。 我們來看一張流程...
摘要:郵件激活后,可以測(cè)試登錄這條命令會(huì)完成登錄,并將認(rèn)證信息報(bào)錯(cuò)起來供后面使用。所以先用命令退出容器,再運(yùn)行命令命令中,指定了要提交的修改過的容器的目標(biāo)鏡像倉庫鏡像名。提交的知識(shí)創(chuàng)建容器的鏡像與容器的當(dāng)前狀態(tài)之間的差異部分,很輕量。 假期快要結(jié)束了,干點(diǎn)正事,接著Docker的學(xué)習(xí)。 構(gòu)建鏡像 構(gòu)建鏡像的兩種方法: 使用docker commit 命令 使用docker build...
摘要:結(jié)構(gòu)型模式適配器模式橋接模式裝飾模式組合模式外觀模式享元模式代理模式。行為型模式模版方法模式命令模式迭代器模式觀察者模式中介者模式備忘錄模式解釋器模式模式狀態(tài)模式策略模式職責(zé)鏈模式責(zé)任鏈模式訪問者模式。 主要版本 更新時(shí)間 備注 v1.0 2015-08-01 首次發(fā)布 v1.1 2018-03-12 增加新技術(shù)知識(shí)、完善知識(shí)體系 v2.0 2019-02-19 結(jié)構(gòu)...
閱讀 3256·2023-04-26 02:10
閱讀 2880·2021-10-12 10:12
閱讀 4557·2021-09-27 13:35
閱讀 1519·2019-08-30 15:55
閱讀 1058·2019-08-29 18:37
閱讀 3423·2019-08-28 17:51
閱讀 1954·2019-08-26 13:30
閱讀 1191·2019-08-26 12:09