第一節的內容,不知道大家看的如何。小編在博客園的評論里,找到了第一篇的一個缺點,沒有把動態改變行為的Duck子類列出來,導致有小伙伴有疑問。在這裡說聲抱歉,是我疏忽了,好在有GitHub,讓大家可以進去一窺究竟,在後續的學習中我也會註意此類問題。 先來解答下上次課程留下的思考題,利用繼承來提供Duc ...
第一節的內容,不知道大家看的如何。小編在博客園的評論里,找到了第一篇的一個缺點,沒有把動態改變行為的Duck子類列出來,導致有小伙伴有疑問。在這裡說聲抱歉,是我疏忽了,好在有GitHub,讓大家可以進去一窺究竟,在後續的學習中我也會註意此類問題。
先來解答下上次課程留下的思考題,利用繼承來提供Duck的行為,這會導致哪些缺點。有以下幾個(看看你的答案是否和他吻合呢):
√A 代碼再多個子類中重覆
√B 運行時的行為不容易改變
√D 難以得知所有鴨子的全部行為
√F 改變會牽一發動全身,造成其他鴨子不想要的改變
然後我們再來回顧下,上一篇說到的幾個變化,通過類圖再次給大家做下復盤。首先來看下最初是的簡單的模型,此時鴨子只會呱呱叫、有外觀顯示以及游泳的能力。
接下來,我們想讓鴨子飛,一開始用了繼承的方式來解決,導致不需要飛行的鴨子類也繼承了這功能, 顯然是不太合理的,也就是開篇說到的繼承存在的幾個缺點。
哈哈,所以我們需要通過介面來實現,把飛行和呱呱叫功能封裝成介面,只有需要相應能力的鴨子自行去實現此介面,這樣就能達到按需獲取的情況
上圖中的Flyable和Quackable 就是鴨子類需要各自去實現的功能,按需實現。那我不想飛的鴨子就不用飛了,不想叫的鴨子就不需要叫了,讓他靜靜地待著吧。
在上圖我們看到了兩個介面是五個實現類,很明確吧,把飛行,不飛行, 呱呱叫,吱吱叫,不叫給你分的清清楚楚,明明白白。
接下來,就是整合鴨子的行為,也就是我在代碼里沒寫明白的部分,實在是對不起各位。
在Duck子類創建的時候,先在構造器里預設創建各個行為類,比如你需要呱呱叫,並且是飛行的行為。
這就是預設的行為,然後你需要動態改變行為,就如前文所說,用setter方法重新定義你需要創建的行為即可,你創建的鴨子能從不會飛變身成裝上火箭助推器的鴨子般給力
public class FlyRocketPowered implements FlyBehavior {
public void fly() {
System.out.println("I'm flying with a rocket!");
}
}
Duck model = new ModelDuck();
// 第一次調用,不會飛
model.performFly();
// 調用繼承來的setter方法,把火箭動力飛行的行為定到模型鴨中,模型鴨能一飛衝天
model.setFlyBehavior(new FlyRocketPowered());
// 這樣就成功的改變了行為
model.performFly();
整個過程最後的圖就是一個父類的Duck,若幹個Duck的子類,一個飛行行為的介面,一個呱呱叫的介面以及若幹個針對介面的實現
好啦,這樣又和大家一起回顧了一遍上一篇的整體流程,你消化了嗎。
在此,我還想聊聊為什麼我們需要設計模式。書中也有提到,大致的意思就是,一個程式員在描述一個功能的時候,巴拉巴拉講了一堆,說要建立一個廣播類來跟蹤所有的對象,只要有更新,就會通知每個傾聽者。這些傾聽者可以隨時加入廣播系統,也可以隨時移除 。結果,一個擁有設計模式的老鳥就隨口說了一句,你用「觀察者模式」來描述剛纔的這個場景,簡單方便,易於溝通,還把所有需要的功能都清楚了,大家相視一笑,哈哈。忽然發現,我有時候也會對我熟悉的設計模式脫口而出,尤其是這個觀察者模式,原來有些東西已經在無形之中影響了我,影響著你。
在書中,這個場景叫「共用模式」。共用模式辭彙威力巨大,總結起來就是:
-
當你使用模式名稱和其他開發人員或者開發團隊溝通時,你們之間交流的不只是模式名稱,而是一整套模式背後所象徵的質量、特性、約束。
-
模式能夠讓你用更少的辭彙做更充分的溝通。
-
當你用模式描述的時候,其他開發人員便很容易地知道你對設計的想法。
-
將說話的方式保持在模式層次,可以讓你待在「設計圈子」久一點。
-
使用模式談論軟體系統,可以讓你保持在設計層次,不會被壓低到對象與類這種瑣碎的事情上面。
-
對於設計模式有深入理解的團隊,彼此之間對於設計的看法不容易產生誤解。
最後聊聊設計模式的工具,書本中叫他為「設計工具箱內的工具」
現在我們對設計模式有了一個初步的認識,接下去就要開始進入這個美妙的世界了。但是,先別急,我們需要帶上屬於我們的工具,把設計模式一一修理乾凈。其實你應該已經猜到是什麼了吧。我還是再啰嗦一下
- OO基礎
抽象、封裝、繼承、多態
- OO原則
封裝變化
多用組合,少用繼承
針對介面編程,不針對實現編程
- OO模式
『策略』--定義演算法族,分別封裝起來,讓他們之間可以相互替換,此模式讓演算法的變化獨立於使用演算法的客戶。
走進設計模式的世界部分就給大家介紹到這裡,拿起我們的工具,往前進吧。
PS:因為最近幾天項目忙,GayHub的事情稍微有點延遲,周末我好好整理下,會儘快輸出。
相關閱讀:設計模式之歡迎來到設計模式世界(一)