一.繼承可能形成的問題有:算法
1.很難知道一個基類應該具備的合理的行爲集合編程
2.後續設計中對於基類的改變,牽一髮而動全身函數
二.相比於基類繼承,抽象出一些接口彷佛能更好的解決一中提到的問題1,2;但代碼重用性變差了設計
那麼如何更好的設計一個類體系呢?讓不變的東西,能夠獲得重用,讓變化的東西能夠實現靈活性,同時也不會使得代碼的重用性變差。。。繼承
三.作法:接口
1.讓肯定不變的東西放在基類中,實現更好的代碼重用和邏輯上的繼承關係。構造函數
2.讓變化的東西實現靈活性,咱們能夠對變化的東西進一步抽象爲接口,採用組合的方式在基類中放入變化東西的接口。方法
3.同時爲了實現代碼的重用性,咱們對每一種變化的類型設計一個類,經過組合,這個類只須要寫一份代碼就能夠使用在各個地方。總結
4.咱們能夠在基類的子類中對接口進行賦值,能夠直接在構造函數中對其賦以須要的實現接口的類,但爲了避免對實現編程,咱們其實更好的作法是實現一些set方法,動態地設定那些變化的類,以及在從此還會學到工廠模式。集合
繼承,接口,組合的綜合使用,使得咱們可以得到更好的類體系結構。
四.設計原則總結:
1.抽取變化的模塊,與不變的模塊分離
2.針對接口編程,而不是針對實現編程
3.多用組合,少用繼承
五.策略模式(Strategy Pattern)的定義:
策略模式定義了算法族,分別封裝起來,讓它們之間能夠互相替換,此模式讓算法的變化獨立於使用算法的客戶。