作法(Mechanics)
- 修改presentation class,使其成為domain class的Observer[GoF]。
- ==》如果尚未有domain class,就建立一個。
- ==》如果沒有[從presentation class到domain class]的關聯性(link),就將domain class保存于presentation class的一個值域中。
- 針對GUI class內的domain data,使用Self Encapsulate Field(171)。
- 編譯,測試。
- 在事件處理函數(event handler)中加上對設值函數(setter)的調用,以[直接訪問方式]更新GUI組件。
- ==》在事件處理函數中放一個設值函數(setter),利用它將GUI組件更新為domain data的當前值。當然這其實沒有必要,你只不過是拿它的值設定它自己。但是這樣使用setter,便是允許其中的任何動作得以于日后被執行起來,這是這一步驟的意義所在。
- ==》進行這個改變時,對于組件,不要使用取值函數(getter),應該采取[直接取用]方式,因為稍后我們將修改取值函數(getter),使其從domain object(而非GUI組件)取值。設值函數(setter)也將遭受類似修改。
- ==》確保測試代碼能夠觸發新添加的事件處理(event handling)機制。
- 編譯,測試。
- 在domain class中定義數據及其相關訪問函數(accessors)。
- ==》確保domain class中的設值函數(setter)能夠觸發Observer模式的通報機制(notify mechanism)。
- ==》對于被觀察(被監視)的數據,在domain class中使用[與presentation class所用的相同型別](通常是字符串)來保存。后續重構中你可以自由改變這個數據型別。
- 修改presentation class中的訪問函數(accessors),將它們的操作對象改為domain object(而非GUI組件)。
- 修改observer的update(),使其從相應的domain object中將所需數據拷貝給GUI組件。
- 編譯,測試。