命令模式
命令模式很好理解,舉個(gè)例子北戏,司令員下令讓士兵去干件事情负芋,從整個(gè)事情的角度來考慮,司令員的作用是嗜愈,發(fā)出口令旧蛾,口令經(jīng)過傳遞,傳到了士兵耳朵里蠕嫁,士兵去執(zhí)行锨天。這個(gè)過程好在,三者相互解耦剃毒,任何一方都不用去依賴其他人病袄,只需要做好自己的事兒就行,司令員要的是結(jié)果迟赃,不會(huì)去關(guān)注到底士兵是怎么實(shí)現(xiàn)的陪拘。我們看看關(guān)系圖:
Invoker是調(diào)用者(司令員),Receiver是被調(diào)用者(士兵)纤壁,MyCommand是命令左刽,實(shí)現(xiàn)了Command接口,持有接收對(duì)象酌媒,看實(shí)現(xiàn)代碼:
public interface Command {
public void exe();
}
public class MyCommand implements Command {
private Receiver receiver;
public MyCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void exe() {
receiver.action();
}
}
public class Receiver {
public void action(){
System.out.println("command received!");
}
}
public class Invoker {
private Command command;
public Invoker(Command command) {
this.command = command;
}
public void action(){
command.exe();
}
}
public class Test {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command cmd = new MyCommand(receiver);
Invoker invoker = new Invoker(cmd);
invoker.action();
}
}
這個(gè)很哈理解欠痴,命令模式的目的就是達(dá)到命令的發(fā)出者和執(zhí)行者之間解耦,實(shí)現(xiàn)請(qǐng)求和執(zhí)行分開秒咨,熟悉Struts的同學(xué)應(yīng)該知道喇辽,Struts其實(shí)就是一種將請(qǐng)求和呈現(xiàn)分離的技術(shù),其中必然涉及命令模式的思想雨席!
介紹
意圖:將一個(gè)請(qǐng)求封裝成一個(gè)對(duì)象菩咨,從而使您可以用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化。
主要解決:在軟件系統(tǒng)中,行為請(qǐng)求者與行為實(shí)現(xiàn)者通常是一種緊耦合的關(guān)系抽米,但某些場(chǎng)合特占,比如需要對(duì)行為進(jìn)行記錄、撤銷或重做云茸、事務(wù)等處理時(shí)是目,這種無法抵御變化的緊耦合的設(shè)計(jì)就不太合適。
何時(shí)使用:在某些場(chǎng)合标捺,比如要對(duì)行為進(jìn)行"記錄懊纳、撤銷/重做、事務(wù)"等處理亡容,這種無法抵御變化的緊耦合是不合適的嗤疯。在這種情況下,如何將"行為請(qǐng)求者"與"行為實(shí)現(xiàn)者"解耦闺兢?將一組行為抽象為對(duì)象身弊,可以實(shí)現(xiàn)二者之間的松耦合。
如何解決:通過調(diào)用者調(diào)用接受者執(zhí)行命令列敲,順序:調(diào)用者→接受者→命令阱佛。
關(guān)鍵代碼:定義三個(gè)角色:1、received 真正的命令執(zhí)行對(duì)象 2戴而、Command 3凑术、invoker 使用命令對(duì)象的入口
應(yīng)用實(shí)例:struts 1 中的 action 核心控制器 ActionServlet 只有一個(gè),相當(dāng)于 Invoker所意,而模型層的類會(huì)隨著不同的應(yīng)用有不同的模型類淮逊,相當(dāng)于具體的 Command。
優(yōu)點(diǎn): 1扶踊、降低了系統(tǒng)耦合度泄鹏。 2、新的命令可以很容易添加到系統(tǒng)中去秧耗。
缺點(diǎn):使用命令模式可能會(huì)導(dǎo)致某些系統(tǒng)有過多的具體命令類备籽。
使用場(chǎng)景:認(rèn)為是命令的地方都可以使用命令模式,比如: 1分井、GUI 中每一個(gè)按鈕都是一條命令车猬。 2、模擬 CMD尺锚。
注意事項(xiàng):系統(tǒng)需要支持命令的撤銷(Undo)操作和恢復(fù)(Redo)操作珠闰,也可以考慮使用命令模式,見命令模式的擴(kuò)展瘫辩。
end
順便在此給大家推薦一個(gè)Java方面的交流學(xué)習(xí)群:957734884伏嗜,里面會(huì)分享一些高級(jí)面試題坛悉,還有資深架構(gòu)師錄制的視頻錄像:有Spring,MyBatis承绸,Netty源碼分析吹散,高并發(fā)、高性能八酒、分布式、微服務(wù)架構(gòu)的原理刃唐,JVM性能優(yōu)化這些成為架構(gòu)師必備的知識(shí)體系羞迷,主要針對(duì)Java開發(fā)人員提升自己,突破瓶頸画饥,相信你來學(xué)習(xí)衔瓮,會(huì)有提升和收獲。在這個(gè)群里會(huì)有你需要的內(nèi)容 朋友們請(qǐng)抓緊時(shí)間加入進(jìn)來吧