請求傳送者與接收者解耦 命令模式(四)

2021-09-01 16:57:56 字數 1625 閱讀 3064

在命令模式中,我們可以通過呼叫乙個命令物件的execute()方法來實現對請求的處理,如果需要撤銷(undo)請求,可通過在命令類中增加乙個逆向操作來實現。

擴充套件

除了通過乙個逆向操作來實現撤銷(undo)外,還可以通過儲存物件的歷史狀態來實現撤銷,後者可使用備忘錄模式(memento pattern)來實現。

下面通過乙個簡單的例項來學習如何使用命令模式實現撤銷操作:

sunny軟體公司欲開發乙個簡易計算器,該計算器可以實現簡單的數**算,還可以對運算實施撤銷操作。

sunny軟體公司開發人員使用命令模式設計了如圖5所示結構圖,其中計算器介面類calculatorform充當請求傳送者,實現了資料求和功能的加法類adder充當請求接收者,介面類可間接呼叫加法類中的add()方法實現加法運算,並且提供了可撤銷加法運算的undo()方法。

圖5 簡易計算器結構圖

本例項完整**如下所示:

//加法類:請求接收者

class adder

}//抽象命令類

abstract class abstractcommand

//具體命令類

class concretecommand extends abstractcommand

//實現抽象命令類中宣告的undo()方法,通過加乙個相反數來實現加法的逆向操作

public int undo()

}//計算器介面類:請求傳送者

class calculatorform

//呼叫命令物件的execute()方法執行運算

public void compute(int value)

//呼叫命令物件的undo()方法執行撤銷

public void undo()

}

編寫如下客戶端測試**:

class client 

}

編譯並執行程式,輸出結果如下:

執行運算,運算結果為:10

執行運算,運算結果為:15

執行運算,運算結果為:25

執行撤銷,運算結果為:15

思考

如果連續呼叫「form.undo()」兩次,**客戶端**的輸出結果。

需要注意的是在本例項中只能實現一步撤銷操作,因為沒有儲存命令物件的歷史狀態,可以通過引入乙個命令集合或其他方式來儲存每一次操作時命令的狀態,從而實現多次撤銷操作。除了undo操作外,還可以採用類似的方式實現恢復(redo)操作,即恢復所撤銷的操作(或稱為二次撤銷)。

練習

修改簡易計算器源**,使之能夠實現多次撤銷(undo)和恢復(redo)。

請求傳送者與接收者解耦 命令模式(四)

在命令模式中,我們可以通過呼叫乙個命令物件的execute 方法來實現對請求的處理,如果需要撤銷 undo 請求,可通過在命令類中增加乙個逆向操作來實現。除了通過乙個逆向操作 來實現撤銷 undo 外,還可以通過儲存物件的歷史狀態 來實現撤銷,後者可使用備忘錄模式 memento pattern 來...

請求傳送者與接收者解耦 命令模式(四)

在命令模式中,我們可以通過呼叫乙個命令物件的execute 方法來實現對請求的處理,如果需要撤銷 undo 請求,可通過在命令類中增加乙個逆向操作來實現。擴充套件 除了通過乙個逆向操作來實現撤銷 undo 外,還可以通過儲存物件的歷史狀態來實現撤銷,後者可使用備忘錄模式 memento patter...

值接收者和指標接收者

go語言中有兩種型別的接收者 值型別的接收者和引用型別的接收者 如果使用值接收者宣告方法,呼叫時會使用這個值的乙個副本來執行。當呼叫使用指標接受者宣告的方法時,這個方法會共享呼叫方法時接收者所指向的值。內建型別 值傳遞 數值型別,字串型別,布林型別 引用型別 應用傳遞 切片,對映,通道,介面,函式型...