<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 請求發送者與接收者解耦——命令模式(四) 5 撤銷操作的實現 在命令模式中,我們可以通過調用一個命令對象的execute()方法來實現對請求的處理,如果需要撤銷(Undo)請求,可通過在命令類中增加一個逆向操作來實現。 擴展 除了通過一個逆向操作來實現撤銷(Undo)外,還可以通過保存對象的歷史狀態來實現撤銷,后者可使用備忘錄模式(Memento Pattern)來實現。 下面通過一個簡單的實例來學習如何使用命令模式實現撤銷操作: Sunny軟件公司欲開發一個簡易計算器,該計算器可以實現簡單的數學運算,還可以對運算實施撤銷操作。 Sunny軟件公司開發人員使用命令模式設計了如圖5所示結構圖,其中計算器界面類CalculatorForm充當請求發送者,實現了數據求和功能的加法類Adder充當請求接收者,界面類可間接調用加法類中的add()方法實現加法運算,并且提供了可撤銷加法運算的undo()方法。 ![](http://img.my.csdn.net/uploads/201304/15/1366039384_7864.jpg) 圖5 簡易計算器結構圖 本實例完整代碼如下所示: ``` //加法類:請求接收者 class Adder { private int num=0; //定義初始值為0 //加法操作,每次將傳入的值與num作加法運算,再將結果返回 public int add(int value) { num += value; return num; } } //抽象命令類 abstract class AbstractCommand { public abstract int execute(int value); //聲明命令執行方法execute() public abstract int undo(); //聲明撤銷方法undo() } //具體命令類 class ConcreteCommand extends AbstractCommand { private Adder adder = new Adder(); private int value; //實現抽象命令類中聲明的execute()方法,調用加法類的加法操作 public int execute(int value) { this.value=value; return adder.add(value); } //實現抽象命令類中聲明的undo()方法,通過加一個相反數來實現加法的逆向操作 public int undo() { return adder.add(-value); } } //計算器界面類:請求發送者 class CalculatorForm { private AbstractCommand command; public void setCommand(AbstractCommand command) { this.command = command; } //調用命令對象的execute()方法執行運算 public void compute(int value) { int i = command.execute(value); System.out.println("執行運算,運算結果為:" + i); } //調用命令對象的undo()方法執行撤銷 public void undo() { int i = command.undo(); System.out.println("執行撤銷,運算結果為:" + i); } } ``` 編寫如下客戶端測試代碼: ``` class Client { public static void main(String args[]) { CalculatorForm form = new CalculatorForm(); AbstractCommand command; command = new ConcreteCommand(); form.setCommand(command); //向發送者注入命令對象 form.compute(10); form.compute(5); form.compute(10); form.undo(); } } ``` 編譯并運行程序,輸出結果如下: ``` 執行運算,運算結果為:10 執行運算,運算結果為:15 執行運算,運算結果為:25 執行撤銷,運算結果為:15 ``` 思考 > 如果連續調用“form.undo()”兩次,預測客戶端代碼的輸出結果。 > 需要注意的是在本實例中只能實現一步撤銷操作,因為沒有保存命令對象的歷史狀態,可以通過引入一個命令集合或其他方式來存儲每一次操作時命令的狀態,從而實現多次撤銷操作。除了Undo操作外,還可以采用類似的方式實現恢復(Redo)操作,即恢復所撤銷的操作(或稱為二次撤銷)。 練習 > 修改簡易計算器源代碼,使之能夠實現多次撤銷(Undo)和恢復(Redo)。
                  <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>

                              哎呀哎呀视频在线观看