模拟鴨子項目:
不使用設計模式的方案:
傳統繼承方式如下:
鴨子超類:
GreenHeadDuck繼承Duck :
同理可有RedHeadDuck等子類
應對新的需求,看看這個設計的可擴充性
1)添加會飛的鴨子
繼承方式解決方案是:
問題來了,這個Fly讓所有子類都會飛了,這是不科學的。
繼承的問題:對類的局部改動,尤其超類的局部改動,會影響其他部分。影響會有溢出效應
繼續使用繼承方式解決方案是(覆寫父類方法):
又有新需求,石頭鴨子,填坑(每個子類都要覆寫父類的方法):
超類挖的一個坑,每個子類都要來填,增加工作量,複雜度O(N^2)。不是好的設計方式
需要新的設計方式,應對項目的擴充性,降低複雜度:
1)分析項目變化與不變部分,提取變化部分,抽象成接口+實作;
2)鴨子哪些功能是會根據新需求變化的?叫聲、飛行...
用政策模式來解決新需求
接口:
好處:新增行為簡單,行為類更好的複用,組合更友善。既有繼承帶來的複用好處,沒有挖坑
重新設計的鴨子項目:
綠頭鴨、石頭鴨:
政策模式:分别封裝行為接口,實作算法族,超類裡放行為接口對象,在子類裡具體設定行為對象。原則就是:分離變化部分,封裝接口,基于接口程式設計各種功能。此模式讓行為算法的變化獨立于算法的使用者。
經驗:多用組合來實作設計。
更詳細的解釋參考