物件導向的乙個偉大的應用例子是活字印刷術。一篇文章印錯了字,只需改錯的字,而無需重新刻模板,就是可維護。印錯的那個字的模組還可以用來印其他文章,就是可復用。文章加字只需另刻字加入,就是可擴充套件。活字可以橫著排打印刷文章,也可豎著、斜著排打印刷文章,就是靈活性好。
物件導向有三大特性,封裝、繼承和多型。封裝是指將物件的實現細節隱藏起來,只通過一些公共方法來暴露物件的功能。繼承是實現**復用的有效手段,當子類繼承父類後將直接擁有父類的屬性和方法。多型是父類型別可例項化為子類型別物件,擁有子類的行為特徵,這會導致同乙個型別的物件在執行相同的方法時可表現出不同的行為特徵。
例如
animal dog = new dog();
dog.talk(); //「汪汪汪」
animal cat = new cat();
cat.talk(); //「喵喵喵」
dog和cat都繼承了animal類,變數dog和cat都是animal型別,但它們呼叫talk()方法時列印出的字串卻不同。
設計模式(design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、**設計經驗的總結,使用設計模式是為了可重用**、讓**更容易被他人理解並且保證**可靠性。
單一職責原則(srp):是指乙個類只應該有乙個引起它變化的原因。
怎麼判斷乙個類只有乙個職責呢?通常乙個類的可能的職責有這幾種:
參考object design: roles, responsibilies, and collaborations一書提出了如下role stereotypes來區分職責:
介面隔離原則(isp):客戶端不應該依賴它不需要的介面,多用組合,少用繼承
依賴倒置原則(dip): 提高靈活性,高層不依賴低層,底層也不依賴搞錯,兩個都應該依賴於抽象。抽象不應該依賴細節,細節應該依賴抽象。
也就是軟體系統應該易插拔,替換掉某個模組不影響其他模組的執行。就像修電腦一樣,記憶體條壞了換記憶體條,螢幕壞了換螢幕,硬碟壞了換硬碟。。。因為這些模組對外的介面是固定的,更換模組內部的實現,對別的模組來說沒有任何影響。所以依賴倒置就是要針對介面程式設計,而不是針對實現程式設計。
黎克特制替換原則(lsp):子類必須能夠替換他們的父類,也就是當軟體使用父類時,應察覺不出父類和任何子類的區別。正是有了黎克特制替換原則,才使得開閉原則成為可能。
迪公尺特法則(lod):類間解耦,類之間聯絡盡可能少
如果兩個類之間不是必須要彼此通訊,那麼這兩個類就不要發生直接的相互作用。如果其中的乙個類a需要呼叫另乙個類b中的某個方法,可通過第三者來**。例如可以把這個方法寫到乙個公共類中,讓類a來呼叫公共類的方法,而不是讓類a直接呼叫類b的方法。
類之間的耦合越弱就越利於復用,因為乙個類被修改就不會影響另乙個類。例如外觀模式。
開閉原則(ocp): 對擴充套件是開放的,對修改是封閉的。
即類、模組、函式等應盡量不修改原有的**,但可以擴充套件新的,以應對變化的需求但又不影響原有功能。面對新需求,程式的改動應是通過增加新**實現的,而不是修改舊**。
但類不可能做到完全封閉,因此應提前**可能發生的變化,或在發生小變化時,及時抽象出變化的部分隔離出來,以應對更大的變化。
但抽象地太多也是過猶不及,應只針對頻繁變化的部分構造抽象。
盡量使用合成/聚合,盡量不使用類繼承。
合成是強擁有關係,嚴格地體現了部分和整體的關係,部分和整體的生命週期一樣。例如翅膀與大雁。就是讓原子類作為原父類的乙個屬性,使用不同的子類時,選擇注入即可。
聚合是弱擁有關係,體現的是a物件可以包含b物件,但b物件不一定是a物件的一部分。例如大雁與雁群。
物件的繼承關係是在編譯時就確定好了,無法在執行時改變從父類繼承的實現。子類的實現與它的父類有非常緊密地依賴關係,以至於父類實現中的任何變化必然會導致子類發生變化。當你需要復用子類時,如果繼承下來的實現不適合解決新的問題,則父類必須重寫或用新的更適合的類替換。這種依賴關係限制了靈活性,並最終限制了可復用性。
設計模式前人總結出來的經驗,是對上述七種設計原則的典型應用。
在軟體工程中,建立型模式是處理物件建立的設計模式,試圖根據實際情況使用合適的方式建立物件。基本的物件建立方式可能會導致設計上的問題,或增加設計的複雜度。建立型模式通過以某種方式控制物件的建立來解決問題。
建立型模式由兩個主導思想構成。一是將系統使用的具體類封裝起來,二是隱藏這些具體類的例項建立和結合的方式。
建立型模式又分為物件建立型模式和類建立型模式。物件建立型模式處理物件的建立,類建立型模式處理類的建立。詳細地說,物件建立型模式把物件建立的一部分推遲到另乙個物件中,而類建立型模式將它物件的建立推遲到子類中。
類建立型包含3種工廠模式:簡單工廠模式、工廠方法模式和抽象工廠模式。
物件建立型包含3種設計模式:建造者模式、原型模式和單例模式。
結構型模式主要是用於處理類或者物件的組合,它描述了如何來類或者物件更好的組合起來,是從程式的結構上來解決模組之間的耦合問題。
結構型模式主要包括:外觀模式、裝飾模式、**模式、介面卡模式、組合模式、橋接模式、享元模式這個7個模式。
行為型模式主要是用於描述類或者物件是怎樣互動和怎樣分配職責的。它涉及到演算法和物件間的職責分配,不僅描述物件或者類的模式,還描述了他們之間的通訊方式,它將你的注意力從控制流轉移到了物件間的關係上來。行為型類模式採用繼承機制在類間分派行為,而行為型物件模式使用物件復合而不是繼承。
行為型模式主要包括11種設計模式:策略模式、狀態模式、職責鏈模式、模板方法模式、備忘錄模式、觀察者模式、迭代器模式、命令模式、中介者模式、直譯器模式、訪問者模式。
設計模式的例子**位址:
6大設計原則 23種設計模式
乙個類只負責一項職責,應該僅有乙個引起它變化的原因。優點 子類可以擴充套件父類的功能,但不能改變父類原有的功能。即任何基類可以出現的地方,子類一定可以出現,並且當用子類替換了基類後程式不受影響。含義 要求對抽象進行程式設計,不要對實現進行程式設計。實際程式設計中需要做到 建立單一介面,不要建立龐大臃...
6大設計原則與23種設計模式
開閉原則 open close principle 黎克特制替換原則 liskov substitution principle 依賴倒置原則 dependence inversion principle 介面隔離原則 inte cesegregation principle 迪公尺特原則 law ...
六大設計原則 23種設計模式
23 種設計模式詳解 全23種 23種設計模式全解析 參考 單一職責原則 乙個類只允許有乙個職責,即只有乙個導致該類變更的原因 黎克特制替換原則 所有引用基類的地方必須能透明地使用其子類的物件,也就是說子類物件可以替換其父類物件,而程式執行效果不變 依賴倒置原則 依賴抽象而不是依賴實現。抽象不應該依...