物件導向的設計原則和設計模式

2021-09-11 02:52:35 字數 2544 閱讀 7856

物件導向程式設計的優點及目的:可復用,可擴充套件,可維護,靈活性好

物件導向程式設計的核心思想:對於變化(或不確定的)的部分,要構造抽象來隔離變化,達到解耦合的效果。介面,多型都是抽象的手段。

物件導向程式設計的七個基本原則:單一職責原則、開放-封閉原則、依賴倒轉原則、黎克特制代換原則、最少知識原則、介面隔離原則、合成復用原則。

單一職責原則:如果乙個類有多於乙個的動機被改變,那麼這個類就具有多於乙個的職責。而單一職責原則就是指乙個類或者模組應該有且只有乙個改變的原因。如果乙個類有乙個以上的職責,這些職責就耦合在了一起。這會導致脆弱的設計。當乙個職責發生變化時,可能會影響其它的職責。另外,多個職責耦合在一起,會影響復用性。

開放-封閉原則:軟體實體(類、模組、函式等等)應該可以擴充套件的,但是不可修改。這一原則的特徵為對於擴充套件是開放的,對於修改是關閉的。

依賴倒轉原則:1.高層模組不應該依賴底層模組,兩個都應該依賴抽象(介面或抽象類)2.抽象不應該依賴細節,細節應該依賴抽象。即針對介面程式設計,不要針對實現程式設計。依賴倒轉原則是物件導向設計的標誌,用哪種程式語言不重要,如果編寫時考慮的都是如何針對抽象程式設計而不是針對細節程式設計,即程式中的所有依賴關係都是終止於抽象類或者介面,那就是物件導向的設計,否則那就是過程化設計了。

黎克特制代換原則:把父類都替換成它的子類程式的行為沒有變化。任何基類可以出現的地方,子類一定可以出現。 黎克特制代換原則是繼承復用的基石,只有當衍生類可以替換掉基類,軟體單位的功能不受到影響時,基類才能真正被復用,而衍生類也能夠在基類的基礎上增加新的行為。黎克特制代換原則是對「開-閉」原則的補充。實現「開-閉」原則的關鍵步驟就是抽象化。而基類與子類的繼承關係就是抽象化的具體實現,所以黎克特制代換原則是對實現抽象化的具體步驟的規範。

最少知識原則(迪公尺特法則):乙個物件應當對其他物件盡可能少的了解。具體要求:

介面隔離原則:客戶端不應該依賴他不需要的介面。對c++而言就是虛基類中的虛函式盡量精簡,虛基類也要保持「單一原則」,虛基類中的虛函式盡量少,否則子類需要實現的介面太多,但卻不一定需要這些介面。保持這一原則的方法就是拆分介面到多個虛基類中,讓子類有選擇的實現。

合成復用原則:盡量使用物件組合,而不是繼承來達到復用的目的。合成復用原則與黎克特制替換原則並不矛盾,對於合成與繼承的選擇有coad法則,在此只列出本篇作者認為重要的兩條:1.子類是基類的乙個特殊種類,而不是基類的乙個角色。區分「has-a」和「is-a」。只有「is-a」關係才符合繼承關係,「has-a」關係應當用聚合來描述。 2.子類具有擴充套件基類的責任,而不是具有置換掉(override)或登出掉(nullify)基類的責任。如果乙個子類需要大量的置換掉基類的行為,那麼這個類就不應該是這個基類的子類。 

不同原則體現的思想和目的:

單一職責原則——封裝,解耦合,復用性

開放-封閉原則——擴充套件性、可維護性

依賴倒轉原則——多型,解耦合,可維護性、靈活性

黎克特制代換原則——繼承,復用性,擴充套件性

最少知識原則——封裝,解耦合,可維護性

介面隔離原則——封裝、多型,解耦合,靈活性

合成復用原則——復用性、擴充套件性

設計模式不是軟體設計的起點,而是終點。換句話說不應該按照23中設計模式去套用,照葫蘆畫瓢,而是讓自己寫的**自然而然的設計成了各種設計模式的樣子。類似無招勝有招吧。知乎上有乙個大神給自己制定了乙個編碼規範類**行數不超過400,函式行數不超過20,巢狀不超過3層,一旦違反此規範,就重構**,經過幾年的時間發現往往能發現其中有些地方符合一些設計模式的地方。也有人認為設計模式的真正價值,他讓程式設計師之間對複雜結構的溝通變得簡單。下面簡單說下設計模式。

物件導向的設計模式主要分為三類:

簡單工廠模式:建立型模式、結構型模式、行為型模式。

建立型模式建立物件時,不再由我們直接例項化物件;而是根據特定場景,由程式來確定建立物件的方式,從而保證更大的效能、更好的架構優勢包括:簡單工廠工廠抽象工廠單例、原型、建造者模式。

結構型模式用於幫助將多個物件組織成更大的結構包括:介面卡、橋接、過濾器、組合、裝飾器外觀享元**

行為型模式用於幫助系統間各物件的通訊,以及如何控制複雜系統中流程包括:責任鏈、命令、直譯器、迭代器、中介者、備忘錄、觀察者狀態、空物件、策略、模板、訪問者。

物件導向設計原則和設計模式

誰來建立另乙個類的示例?對於類a和類b,滿足下列條件 1.b包含a 2.b記錄a 3.b和a關係很密切 4.b擁有a例項化所必需的示例 則應該由b來建立a的例項,其中1 2優先 為乙個物件分配職責的一般原則是什麼?誰具有完成一件事情所必須的資訊,就把職責分配給它 步驟 1.把職責描述清楚 2.設計模...

物件導向的設計原則和設計模式

在實際的開發中,我們要想更深入的了解物件導向思想,就必須熟悉前人總結過的物件導向的思想的設計原則單一職責原則開閉原則黎克特制替換原則依賴注入原則介面分離原則迪公尺特原則其實就是開發人員經常說的 高內聚,低耦合 也就是說,每個類應該只有乙個職責,對外只能提供一種功能,而引起類變化的原因應該只有乙個。在...

設計模式 物件導向設計原則

軟體的可維護性和可複製性是兩個非常重要的軟體質量屬性 物件導向物件設計原則是設計模式學習的基礎。每乙個設計模式都符合乙個或者多個物件導向設計原則 單一職責原則是最簡單的物件導向設計原則,它用於控制類的粒度大小 單一設計原則 乙個物件應該只包含單一的職責,並且該職責被完整的封裝在乙個類裡 這也意味著 ...