<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 命令模式 命令模式(Command Pattern)是一種數據驅動的設計模式,它屬于行為型模式。請求以命令的形式包裹在對象中,并傳給調用對象。調用對象尋找可以處理該命令的合適的對象,并把該命令傳給相應的對象,該對象執行命令。 ## 介紹 **意圖:**將一個請求封裝成一個對象,從而使您可以用不同的請求對客戶進行參數化。 **主要解決:**在軟件系統中,行為請求者與行為實現者通常是一種緊耦合的關系,但某些場合,比如需要對行為進行記錄、撤銷或重做、事務等處理時,這種無法抵御變化的緊耦合的設計就不太合適。 **何時使用:**在某些場合,比如要對行為進行"記錄、撤銷/重做、事務"等處理,這種無法抵御變化的緊耦合是不合適的。在這種情況下,如何將"行為請求者"與"行為實現者"解耦?將一組行為抽象為對象,可以實現二者之間的松耦合。 **如何解決:**通過調用者調用接受者執行命令,順序:調用者→接受者→命令。 **關鍵代碼:**定義三個角色:1、received 真正的命令執行對象 2、Command 3、invoker 使用命令對象的入口 **應用實例:**struts 1 中的 action 核心控制器 ActionServlet 只有一個,相當于 Invoker,而模型層的類會隨著不同的應用有不同的模型類,相當于具體的 Command。 **優點:** 1、降低了系統耦合度。 2、新的命令可以很容易添加到系統中去。 **缺點:**使用命令模式可能會導致某些系統有過多的具體命令類。 **使用場景:**認為是命令的地方都可以使用命令模式,比如: 1、GUI 中每一個按鈕都是一條命令。 2、模擬 CMD。 **注意事項:**系統需要支持命令的撤銷(Undo)操作和恢復(Redo)操作,也可以考慮使用命令模式,見命令模式的擴展。 ## 實現 我們首先創建作為命令的接口 _Order_,然后創建作為請求的 _Stock_ 類。實體命令類 _BuyStock_ 和 _SellStock_,實現了 _Order_ 接口,將執行實際的命令處理。創建作為調用對象的類 _Broker_,它接受訂單并能下訂單。 _Broker_ 對象使用命令模式,基于命令的類型確定哪個對象執行哪個命令。_CommandPatternDemo_,我們的演示類使用 _Broker_ 類來演示命令模式。 ![命令模式的 UML 圖](https://box.kancloud.cn/2015-12-13_566cdfbacff4a.jpg) ### 步驟 1 創建一個命令接口。 _Order.java_ ``` public interface Order { void execute(); } ``` ### 步驟 2 創建一個請求類。 _Stock.java_ ``` public class Stock { private String name = "ABC"; private int quantity = 10; public void buy(){ System.out.println("Stock [ Name: "+name+", Quantity: " + quantity +" ] bought"); } public void sell(){ System.out.println("Stock [ Name: "+name+", Quantity: " + quantity +" ] sold"); } } ``` ### 步驟 3 創建實現了 _Order_ 接口的實體類。 _BuyStock.java_ ``` public class BuyStock implements Order { private Stock abcStock; public BuyStock(Stock abcStock){ this.abcStock = abcStock; } public void execute() { abcStock.buy(); } } ``` _SellStock.java_ ``` public class SellStock implements Order { private Stock abcStock; public SellStock(Stock abcStock){ this.abcStock = abcStock; } public void execute() { abcStock.sell(); } } ``` ### 步驟 4 創建命令調用類。 _Broker.java_ ``` import java.util.ArrayList; import java.util.List; public class Broker { private List<Order> orderList = new ArrayList<Order>(); public void takeOrder(Order order){ orderList.add(order); } public void placeOrders(){ for (Order order : orderList) { order.execute(); } orderList.clear(); } } ``` ### 步驟 5 使用 Broker 類來接受并執行命令。 _CommandPatternDemo.java_ ``` public class CommandPatternDemo { public static void main(String[] args) { Stock abcStock = new Stock(); BuyStock buyStockOrder = new BuyStock(abcStock); SellStock sellStockOrder = new SellStock(abcStock); Broker broker = new Broker(); broker.takeOrder(buyStockOrder); broker.takeOrder(sellStockOrder); broker.placeOrders(); } } ``` ### 步驟 6 驗證輸出。 ``` Stock [ Name: ABC, Quantity: 10 ] bought Stock [ Name: ABC, Quantity: 10 ] sold ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看