溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中怎么實(shí)現(xiàn)命令模式

發(fā)布時(shí)間:2021-07-01 15:16:06 來(lái)源:億速云 閱讀:156 作者:Leah 欄目:大數(shù)據(jù)

Java中怎么實(shí)現(xiàn)命令模式,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

命令模式

命令模式很好理解,舉個(gè)例子,司令員下令讓士兵去干件事情,從整個(gè)事情的角度來(lái)考慮,司令員的作用是,發(fā)出口令,口令經(jīng)過(guò)傳遞,傳到了士兵耳朵里,士兵去執(zhí)行。這個(gè)過(guò)程好在,三者相互解耦,任何一方都不用去依賴其他人,只需要做好自己的事兒就行,司令員要的是結(jié)果,不會(huì)去關(guān)注到底士兵是怎么實(shí)現(xiàn)的。我們看看關(guān)系圖:

Java中怎么實(shí)現(xià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í)行分開(kāi),熟悉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í),這種無(wú)法抵御變化的緊耦合的設(shè)計(jì)就不太合適。

時(shí)使用:在某些場(chǎng)合,比如要對(duì)行為進(jìn)行"記錄、撤銷/重做、事務(wù)"等處理,這種無(wú)法抵御變化的緊耦合是不合適的。在這種情況下,如何將"行為請(qǐng)求者"與"行為實(shí)現(xiàn)者"解耦?將一組行為抽象為對(duì)象,可以實(shí)現(xiàn)二者之間的松耦合。

如何解決:通過(guò)調(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)有過(guò)多的具體命令類。

使用場(chǎng)景:認(rèn)為是命令的地方都可以使用命令模式,比如:1、GUI 中每一個(gè)按鈕都是一條命令。2、模擬 CMD。

注意事項(xiàng):系統(tǒng)需要支持命令的撤銷(Undo)操作和恢復(fù)(Redo)操作,也可以考慮使用命令模式,見(jiàn)命令模式的擴(kuò)展。

關(guān)于Java中怎么實(shí)現(xiàn)命令模式問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI