設計模式精粹

2021-06-22 06:15:29 字數 2639 閱讀 3581

設計模式是軟體開發領域的孫子兵法,真正理解、精通、熟記設計模式,在適當的場合採用適當的設計模式來設計和編碼,將極大提高**的健壯性、可擴充套件性、可維護性,是高手與菜鳥分水嶺的顯著標誌之一。

每乙個軟體設計和開發人員都必須掌握設計模式。

設計模式種類較多,即使深刻理解嫻熟運用,時間久了也容易遺忘,需要時常溫習。本文嘗試以簡短的文字概括各個常用設計模式的精華,不畫uml圖、不寫例子,期望在深刻學習過設計模式的前提下,在遺忘之後,通過閱讀本文,可以快速的溫習各個設計模式的精華。初學者一般很難直接全部看懂,需提綱挈領後再尋書深究。

一、設計原則

1、面向介面程式設計。預先設計一系列介面,將設計與實現分離,使用時只採用介面;物件導向程式設計中,盡量多採用介面,而不是繼承。

2、單一職責原則。設計乙個類時,類的功能要單一,只做與其相關的事情。

3、開放封閉原則。設計軟體系統時,應對擴充套件開放,對修改封閉:有需求時,可以對現有**進行擴充套件,而不是修改已經寫好的類。

4、最小知識原則。類與類之間應該儘量減少耦合,兩個複雜的類之間可以不直接引用打交道,通過簡單的第三方媒介來通訊即可。

5、聚合復用原則。使已經存在的物件成為新物件的一部分;物件導向程式設計中,盡量使用合成和聚合,盡量不採用繼承。

二、設計模式

(一)建立型設計模式

1、靜態工廠模式。用乙個專門的工廠類來負責建立具體的產品物件,工廠返回的物件型別是具體物件的抽象介面。

2、工廠方法模式。每個具體的產品物件由自己所屬型別的具體工廠型別來建立,每乙個具體工廠型別是乙個相同工廠抽象介面的實現。

3、抽象工廠模式。工廠抽象介面定義了相同抽象介面返回型別的多個介面方法,這些介面方法描述了工廠的產品等級結構,這個工廠抽象介面的每個工廠實現則描述了乙個產品族。

4、單例模式。乙個類只有乙個例項,通過靜態方法來訪問該例項。

5、原型模式。通過對作為原型的物件複製來構建新的物件。

6、建立型模式。定義乙個專門的導演者類來構造複雜物件,構造物件時導演者類通過形參傳入的建立者介面型別的例項,按照既定的順序來呼叫建立者例項提供的介面方法來構造複雜物件的細節。

(二)結構型設計模式

1、裝飾模式。抽象裝飾類實現裝飾介面,同時將該裝飾介面型別的物件作為自己的成員,這樣抽象裝飾類的實現類具體在客戶端看來既具有裝飾介面的特徵可以當著被修飾物件來看待,又由於具有裝飾介面型別的實際被修飾物件成員可訪問,這樣在介面行為上實現對被修改物件的裝飾處理。

2、外觀模式。將底層功能細節進行組合封裝,對外提供更高階的封裝介面,外部只與封裝介面打交道。

3、享元模式。將具有相同介面型別的細粒度的物件儲存在工廠類中,當需要物件時直接從工廠類中獲取,達到共享、減少記憶體的目的。

4、介面卡模式。類介面卡模式通過繼承被適配的物件,在類中提供適配目標的方法來適配目標;物件介面卡模式將被適配物件作為自己的成員,在類中通過對被適配物件的訪問來提供實適配目標的方法。

5、**模式。**物件和被**物件都實現了相同的介面,**物件將被**物件作為自己的成員,客戶端直接與**物件打交道,**物件在介面訪問時根據業務邏輯既可以作自己的**處理,也可以通過訪問被**成員來作實際的處理。

6、橋接模式。抽象類通過提供抽象方法實現方法的擴充套件,同時通過將介面型別作為成員實現屬性的擴充套件,在方法和屬性兩個維度上實現抽象和實現的分離,提高可維護性和擴充套件性。

7、組合模式。葉子節點和樹枝節點都實現相同的介面,介面統一提供樹枝節點的訪問、遍歷方法,葉子節點對於遍歷方法可以為空處理,這樣在客服端看來葉子節點和樹枝節點的訪問方法是完全透明的。

(三)行為模式

1、模板方法模式。抽象類中定義一系列的抽象方法,同時提供統一的方法按照既定的業務邏輯依次呼叫這些抽象方法,這樣抽象類的具體實現類只需實現這些分離的抽象方法即可,訪問實現類的抽象父類定義的統一方法將具有相同的業務邏輯。

2、觀察者模式。被觀察的物件中註冊有多個具有相同介面型別的觀察者物件,當被觀察的物件狀態有改變時,通過遍歷訪問這些註冊的觀察物件的介面方法,通知各個觀察者被觀察物件的改變,各觀察者在介面方法中實現自身的響應處理。

3、狀態模式。使用者物件將介面型別的狀態物件作為自己的成員,同時狀態介面型別的介面方法將使用者物件作為自己的形參,這樣當呼叫使用者物件的方法時,該方法內部將使用者物件自身作為引數傳遞給狀態成員,通過呼叫狀態成員的方法來實現反應當前狀態的業務處理。

4、策略模式。策略的外部封裝類持有介面型別的策略成員,該類提供封裝的統一方法來呼叫策略成員方法,這樣通過構造將不同的策略實現類成員的封裝類物件,即可得到不同的具體策略返回結果。

C程式設計精粹

規則或建議。每條準則都有例外 1,假想的編譯程式 使用編譯程式所有的可選警告設施 使用lint來查出編譯程式漏掉的錯誤 如果有單元測試,就進行單元測試 2,自己設計並使用斷言 既要維護程式的交付版本,又要維護程式的除錯版本 要使用斷言對函式引數進行確認 要從程式中刪去無定義的特性,或者在程式中使用斷...

js語言精粹

1 typeof null object 所以不能通過typeof object 判斷為物件 a 判斷為null的,直接 null b 判斷物件 typeof object 因為null為假 2 prototype和 proto 的概念 prototype是函式的乙個屬性 每個函式都有乙個proto...

人生哲學精粹

自助者,天助。在你失敗或處於困境時,能夠幫助你,使你重新獲得希望,重新看到光明的,只有你自己!天助強者。在任何處境中,都要保持著平靜樂觀的心態,保持著幽默。只有熱情和激情,才能贏得積極的人生和快樂的生活。過分的生氣或憤怒,不但於事無補,反而可能也會使事情或處境變得更糟。快樂不是因為你擁有多少,而是你...