正文
一、設計原則
1、封裝變化
找出應用中可能需要變化之處,把它們獨立出來,不要和那些不需要變化的程式碼混在一起。
2、針對介面程式設計,不針對實現程式設計
“針對介面程式設計”真正的意思是“針對超型別程式設計”。
超型別可以是抽象類或者介面,關鍵是要利用多型,這樣程式執行時會根據實際狀況執行到真正的行為,不會被綁死在超型別的行為上。
“針對超型別程式設計”可以更明確地說成:變數的宣告型別應該是超型別,如此,只要是具體實現此超型別的類所產生的物件,都可以指定給這個變數。這也意味著,宣告類時不用理會以後執行時的真正物件型別。
3、多用組合,少用繼承
“有一個”一般比“是一個”更好。換句話說,通過在類中持有其他類來獲得新的行為一般會比通過繼承來獲得新的行為好。
“組合”就是將多個類組合起來使用,即在一個類中持有其他類的引用。
4、為了互動物件之間的鬆耦合而努力
“鬆耦合”使物件之間的互相依賴降到了最低。如此一來,當一個物件發生改變時,對其他物件的影響也降到了最低。
5、開閉原則:類應該對擴充套件開放,對修改關閉
應該讓類在不修改現有程式碼的情況下,就可搭配新的行為。
6、依賴倒置原則:要依賴抽象,不要依賴具體類
不能讓高層元件依賴低層元件,而且,不管高層或低層元件,都應該依賴於抽象。
所謂“高層”元件,是指由其他低層元件定義其行為的類。
避免違反依賴倒置原則的指導方針:
- 變數不可以持有具體類的引用。
- 不要讓類派生自具體類。
- 不要覆蓋基類中已實現的方法。
7、最少知識原則:減少物件之間的互動,只留下幾個“密友”
不要讓太多的類耦合在一起,免得修改系統中的一部分,會影響到其他部分。
為了避免違反最少知識原則,在物件的方法內,我們只應該呼叫屬於以下範圍的方法:
- 該物件本身。
- 被當作方法的引數而傳遞進來的物件。
- 此方法所建立或例項化的物件。
- 物件的元件,即被例項變數所引用的物件。
8、好萊塢原則:別呼叫(打電話給)我們,我們會呼叫(打電話給)你
在好萊塢原則下,我們允許低層元件將自己掛鉤到系統上,但是高層元件會決定什麼時候和怎樣使用這些低層元件。
換句話說,高層元件對待低層元件的方式是“別呼叫我們,我們會呼叫你”。
9、單一責任原則:一個類應該只有一個引起變化的原因
我們知道要避免類內的改變,因為修改程式碼很容易造成許多潛在的錯誤。
如果一個類具有兩個改變的原因,會使得將來該類的變化機率上升,而當它真的改變時,你的設計中同時有兩個方面將會受到影響。
二、定義設計模式
模式是在某情境下,針對某問題的某種解決方案。
- 情境:應用某個模式的情況。這應該是會不斷出現的情況。
- 問題:你想在某情境下達到的目標,或者某情景下的約束。
- 解決方案:你所追求的一個通用的設計,它可以用來解決約束、達到目標。
三、設計模式分類
1、建立型模式
建立型模式涉及到將物件例項化,這類模式都提供一個方法,將客戶從所需要例項化的物件中解耦。
- 工廠方法模式:由子類決定要建立的具體類是哪一個。
- 抽象工廠模式:允許客戶建立物件的家族,而無需指定它們的具體類。
- 單件模式(單例模式):確保有且只有一個物件被建立。
- 生成器模式(建造者模式):封裝一個複雜物件的建立過程。
- 原型模式:通過複製現有的例項來建立新的例項。
2、行為型模式
行為型模式涉及到類和物件如何互動及分配職責。
- 策略模式:封裝可以互換的行為,並使用委託來決定要使用哪一個。
- 觀察者模式:讓物件能夠在狀態改變時被通知。
- 命令模式:封裝請求成為物件。
- 模板方法模式:由子類決定如何實現一個演算法中的步驟。
- 迭代器模式:在物件的集合之中游走,而不暴露集合的實現。
- 狀態模式:封裝了基於狀態的行為,並使用委託在行為之間切換。
- 責任鏈模式:為某個請求建立一個物件鏈。
- 直譯器模式:將每一個語法規則表示成一個類。
- 中介者模式:封裝一系列物件之間的互動。
- 備忘錄模式:在物件外部儲存物件的某個狀態。
- 訪問者模式:通過訪問資料結構中的每個元素,來對元素進行各種操作。
3、結構型模式
結構型模式涉及到類和物件如何被組合以建立新的結構或新的功能。
- 裝飾者模式:包裝一個物件,以提供新的行為。
- 介面卡模式:封裝物件,並提供不同的介面。
- 外觀模式:簡化一群類的介面。
- 組合模式:客戶用一致的方式處理物件集合和單個物件。
- 代理模式:包裝物件,以控制對此物件的訪問。
- 橋接模式:分離抽象與實現,使它們可以獨立變化。
- 蠅量模式(享元模式):運用共享技術,減少物件的建立。
相關文章
《Head First 設計模式》:策略模式
《Head First 設計模式》:觀察者模式
《Head First 設計模式》:裝飾者模式
《Head First 設計模式》:工廠方法模式
《Head First 設計模式》:抽象工廠模式
《Head First 設計模式》:單件模式
《Head First 設計模式》:命令模式
《Head First 設計模式》:介面卡模式
《Head First 設計模式》:外觀模式
《Head First 設計模式》:模板方法模式
《Head First 設計模式》:迭代器模式
《Head First 設計模式》:組合模式
《Head First 設計模式》:狀態模式
《Head First 設計模式》:代理模式
《Head First 設計模式》:剩下的模式
交流區
微信公眾號:驚卻一目
個人部落格:驚卻一目