設計模式(七大原則)

2022-02-16 14:42:56 字數 2799 閱讀 1530

1、設計模式相關概念

(1)重要性

設計模式(design pattern)對軟體設計中普片存在的問題所提出的解決方案(不拘泥於某種語言),可以增強專案的擴充套件性、維護性,因為設計模式不是為了軟體的功能的實現,而是站在軟體的設計的角度

(2)目的

增強可維護性、重用性、靈活性、可靠性(增加或減少新功能後對原有的功能沒有影響),實現高內聚低耦合

2、設計模式的七大原則

(1)概念

設計模式設計的依據

(2)七大原則

例如:乙個類只負責一項職責,如果乙個類有多個職責,那麼在修改其中乙個職責的時候可能會對其他的職責造成影響,就應該將不同的職責分配到不同的類中。

類級別:

有乙個交通工具類中有乙個run方法,那麼所有的交通工具都可以呼叫run方法,汽車、火車等,但是,飛機呼叫run方法可能就會不合理了,因為飛機是在天上飛的。此時有乙個解決方案就是再建立乙個飛行器類,火車和汽車呼叫陸地上的交通工具類的run方法,飛機呼叫飛行器的run方法

方法級別(沒有完全遵守單一職責原則,只有在類級別的是真正的單一職責原則):

將不同的職責放到不同的類中做到的單一職責需要的改動較大,可以採用在乙個類中定義不同的方法的方式實現單一職責原則,就是不同的方法實現不同的職責,使用類的同乙個物件呼叫不同方法即可(在類中的方法足夠少的時候可以違反單一職責原則)。

好處:提高**的可讀性、可維護性和內聚性

降低變更引起的風險

上面的介面設計存在乙個問題,class3通過介面inter呼叫class1的方法的時候只用到了前三個方法後面的兩個方法是多餘的

上面的uml圖中對介面進行了拆分,使得class1和class2中的方法都是class3和class4所需要使用的方法,這樣就符合了介面的隔離原則。也就是說乙個類在通過介面呼叫另外乙個介面的實現類的方法的時候這個實現類應該是最小的(沒有多餘的方法)

高層模組不應該依賴低層模組,二者都應該依賴其抽象,抽象不應該依賴細節,細節應該依賴抽象

中心思想是面向介面程式設計

public string getmessage(email email)

public string getmessage(imessage messge)
依賴倒轉原則的注意事項:

低層模組盡量要有抽象類或介面,或者兩者都有

變數的宣告型別盡量是抽象類或介面,這樣我們的變數引用和實際物件之間就存在乙個緩衝(例如:字類在繼承父類的方法的時候可以重寫父類的方法,對方法的功能進行優化),利於程式的擴充套件和優化

繼承的時候遵循黎克特制替換原則

父類中有乙個計算兩個數的差的方法,子類的乙個計算兩個數的和的方法與父類中的方法重名了(無意中重寫了父類的方法),通常的避免此種情況發生的做法是讓原來的父類和子類都繼承乙個更通俗的基類,原有的繼承關係去掉,採用依賴、聚合、組合等關係。黎克特制替換準則要求我們盡量不要重寫父類中的方法(原文中說:繼承必須確保超類所擁有的性質在子類中仍然成立)

子類對父類的方法進行重寫在運用多型的時候回出錯,在沒有重寫的情況下使用多型呼叫的是父類中的方法,在字類重寫了父類的方法的時候執行的是字類的方法,在客戶端呼叫的時候容易出現錯誤

也就是說將a類和b類共有的內容放到base類中,將a和b的關係變為依賴、聚合、組合等關係,a類和b類的耦合性就降低了。列如:麻雀繼承抽象類鳥,但是公雞要是想繼承抽象類是不能繼承抽象方發fly的,此時重寫該方法就會違背黎克特制替換原則。可以讓鳥和公雞都繼承動物類,鳥的字類有麻雀等

組合:b類呼叫a類的方法,可以在b類中建立乙個a類的物件

private a a =new a();
乙個軟體實體,如:類、模組和函式應該對擴充套件開放(**方),對修改關閉(使用方),用抽象構建框架(抽象類和介面),用實現擴充套件細節。當軟體需要變化的時候,盡量通過擴充套件軟體來實現變化而不是通過修改已有的**來實現變化。 實現開放封閉原則的核心思想就是對抽象程式設計,而不對具體程式設計,因為抽象相對穩定。讓類依賴於固定的抽象,所以修改就是封閉的。而通過物件導向的繼承和多型機制,又可以實現對抽象類的繼承,通過覆寫其方法來改變固有行為,實現新的拓展方法,所以就是開放的。

例如:定義乙個圖形的抽象類,類中有乙個draw方法,其它圖形可以繼承抽象類重寫draw方法,在繪製圖形的類的方法中只需要傳遞父類型別的引數(使用方是不需要改變的),當再擴充套件的的時候修改也是較小的。

乙個a類如果依賴(繼承、聚合等關係)於b類,要保證他們之間的耦合度盡量降低,b類除了暴漏乙個public方法,不對外洩露任何資訊。核心是降低類與類之間的耦合度。依賴者:只依賴的物件,被依賴者:只暴漏應該暴漏的方法

如果是作為成員變數、方法的引數或方法的返回值就稱為直接朋友,如果出現在區域性作用域就不是直接朋友

盡量使用合成/聚合,而不是使用繼承

3、設計模式型別

(1) 建立型:如何建立物件

單例、抽象工廠、工廠方法、原型、建造者

(2)結構型:如何將類或物件按某種布局組成更大的結構

介面卡、橋接、裝飾、組合、外觀、享元、**

(3)行為型:類或物件之間怎樣相互協作共同完成單個物件都無法單獨完成的任務,以及怎樣分配職責

模板方法、命令、訪問者、迭代器、觀察者、中介者、備忘錄、直譯器、狀態、策略、責任鏈

設計模式七大原則

open closed principle ocp 最基礎的原則,對擴充套件開放,對修改關閉強調的是用抽象構建框架,用實現擴充套件細節,可以提高軟體系統的可復用性和可維護性 dependence inversion principle,dip 程式要依賴於抽象介面,不要依賴於具體實現。即面向介面程式...

設計模式 七大原則

懂了設計模式,你就懂了物件導向分析和設計 ooa d 的精要.編寫軟體的過程,面臨 耦合性 內聚性 維護性 可擴充套件性 重用性 靈活性 等各方面的挑戰。設計模式就是為了解決這些問題 程式設計時遵循的原則,各種設計模式的基礎 注意事項和細節 那麼問題來了,如何正確使用繼承?答案 黎克特制替換原則 基...

設計模式七大原則

編寫軟體過程中,程式設計師面臨著來自耦合性,內聚性以及可維護性,可擴充套件性,重用性,靈活性等多方面的挑戰,設計模式是為了讓程式具有更好以下特性 1 重用性 即 相同功能的 不用多次編寫 3 可擴充套件性 即 當需要增加新的功能時,非常的方便,稱為可維護 4 可靠性 即 當我們增加新的功能後,對原來...