一種不方便的差異程序開發
作者:佚名 時間:2012-06-10 分享到:
任何組合模式的實現都需要處理一個困難的問題,我們在開始的時候說組合模式的目的是,使葉子對象和組合對象看上去幾乎沒有不同,我們這里說"幾乎"是因為組合和葉子之間有一個必須正視的差異,組合對象必須管理它的子對象,這也就是說組合對象需要具備一個用來獲得其子對象的方法,并且還需要移除子對象的方法,至于葉子類,它們當然沒有需要管理的子對象,這是葉子類的本性.
具體如何來處理這種不同視我們的需求而定,一方面,我們可以將組合和葉子對象做的不同,例如,我們可以為組合對象提供add_child和remove_child方法(或對應的數組式樣的去處符),并在葉子對象中忽略這些方法,這種方法背后的邏輯是,畢竟葉子對象是沒有子對象的,所以它們不需要管理子對象的功能.
另一方面,組合模式的目的是要使葉子對象和組合對象之間沒有明顯區別,如果使用你的組合代碼需要知道只有部分組件(即那些組合對象)具備get_child和add_child方法,而其他組件(即葉子對象)并沒有這些方法,那么葉子和組合對象就具有明顯區別子,但是話說回來,如果我們在葉子對象中加入子處理子對象的方法,那么如果外部調用子這些方法將會發生什么呢?要回復對remover_child的調用并不是太困難,葉子對象并沒有子對象,所以沒什么會被刪除,但是如果有八調用子一個葉子對象的add_child方法的話怎么辦呢/你是會忽略這個調用叫勁,還是會跳出一個異常.
正如我之前所說的,你如何來做這個決定取決于你的喜好,允許葉子對象和組合對象之間存在不同,或者硬將葉子對象無法處理的方法放在葉子對象沒有子對象,我的本能選擇是將這些方法留在葉子對象中,不過那么的話,我們將不得不承認葉子對象是無法處理子對象的.