在最近的維護版本的開發中,經常碰到的一個問題:接手的項目中使用了OO的觀念,可是大量使用繼承,造成對子類的行為約束的過緊,子類很難擴展,此時如果修改父類的話,又容易誤傷子類(因為一些子類的行為修改,而另一些又不需要修改)。被百般折磨後發現了策率模式,故在此記錄下。
為了表示結構,使用了下面的類圖,很簡單。DuckA,DuckB,DuckC均繼承自Duck,並在Duck中實現了Swim()Quack(),所以現在的所有的鴨子都會游泳,都會叫,因為鴨子長的可以不一樣,所以在子類中分別實現了Display()。
此時,我們可能想到第二個方案是,將變化剝離出來,即將Quack()作成接口,會叫的鴨子實現該接口。這樣看似很合適,因為解決了DuckD不會叫的問題,而且更加符合OO的設計。但是這並不能解決代碼重復的問題,即DuckA,DuckB中Quack()的實現是一樣的。繼承了接口,但是依然無法達到代碼的復用。
此時我們該怎麼辦呢?