設計模式的分類及功能划分


設計模式有兩種分類方法,即根據模式的目的來分和根據模式的作用的范圍來分。

一、根據目的來分;通過完成什么工作划分為創建型模式結構型模式行為型模式 3 種類型

  1、創建型模式:作用於對象的創建,將對象的創建與使用分離。其中囊括了單例、原型、工廠方法、抽象工廠、建造者5 種創建型模式。

  2、結構型模式:將類或對象按某種布局組成更大的結構,其中以代理、適配器、橋接、裝飾、外觀、享元、組合 7 種結構型模式為主。

  3、行為型模式:作用於類或對象之間相互協作共同完成單個對象無法單獨完成的任務,以及怎樣分配職責。主要包含了模板方法、策略、命令、職責鏈、狀態、觀察 

             者、中介者、迭代器、訪問者、備忘錄、解釋器等 11 種行為型模式。

二、根據作用范圍來分;根據是用於類上還是用於對象上划分分為類模式對象模式兩種。

  1、類模式:用於處理類與子類之間的關系,這些關系通過繼承來建立,在編譯時刻便確定下來了。工廠方法、(類)適配器、模板方法、解釋器均屬於該模式。

  2、對象模式:用於處理對象之間的關系,這些關系可以通過組合或聚合來實現,在運行時刻是可以變化的,更具動態性。除了以上 4 種,其他的都是對象模式。

設計模式的分類表

 

設計模式的功能

1、單例(Singleton)模式:某個類只能生成一個實例,該類提供了一個全局訪問點供外部獲取該實例,其拓展是有限多例模式。
2、原型(Prototype)模式:將一個對象作為原型,通過對其進行復制而克隆出多個和原型類似的新實例。
3、工廠方法(Factory Method)模式:定義一個用於創建產品的接口,由子類決定生產什么產品。
4、抽象工廠(AbstractFactory)模式:提供一個創建產品族的接口,其每個子類可以生產一系列相關的產品。
5、建造者(Builder)模式:將一個復雜對象分解成多個相對簡單的部分,然后根據不同需要分別創建它們,最后構建成該復雜對象。
6、代理(Proxy)模式:為某對象提供一種代理以控制對該對象的訪問。即客戶端通過代理間接地訪問該對象,從而限制、增強或修改該對象的一些特性。
7、適配器(Adapter)模式:將一個類的接口轉換成客戶希望的另外一個接口,使得原本由於接口不兼容而不能一起工作的那些類能一起工作。
8、橋接(Bridge)模式:將抽象與實現分離,使它們可以獨立變化。它是用組合關系代替繼承關系來實現,從而降低了抽象和實現這兩個可變維度的耦合度。
9、裝飾(Decorator)模式:動態的給對象增加一些職責,即增加其額外的功能。
10、外觀(Facade)模式:為多個復雜的子系統提供一個一致的接口,使這些子系統更加容易被訪問。
11、享元(Flyweight)模式:運用共享技術來有效地支持大量細粒度對象的復用。
12、組合(Composite)模式:將對象組合成樹狀層次結構,使用戶對單個對象和組合對象具有一致的訪問性。
13、模板方法(TemplateMethod)模式:定義一個操作中的算法骨架,而將算法的一些步驟延遲到子類中,使得子類可以不改變該算法結構的情況下重定義該算法的某些特定步驟。
14、策略(Strategy)模式:定義了一系列算法,並將每個算法封裝起來,使它們可以相互替換,且算法的改變不會影響使用算法的客戶。
15、命令(Command)模式:將一個請求封裝為一個對象,使發出請求的責任和執行請求的責任分割開。
16、職責鏈(Chain of Responsibility)模式:把請求從鏈中的一個對象傳到下一個對象,直到請求被響應為止。通過這種方式去除對象之間的耦合。
17、狀態(State)模式:允許一個對象在其內部狀態發生改變時改變其行為能力。
18、觀察者(Observer)模式:多個對象間存在一對多關系,當一個對象發生改變時,把這種改變通知給其他多個對象,從而影響其他對象的行為。
19、中介者(Mediator)模式:定義一個中介對象來簡化原有對象之間的交互關系,降低系統中對象間的耦合度,使原有對象之間不必相互了解。
20、迭代器(Iterator)模式:提供一種方法來順序訪問聚合對象中的一系列數據,而不暴露聚合對象的內部表示。
21、訪問者(Visitor)模式:在不改變集合元素的前提下,為一個集合中的每個元素提供多種訪問方式,即每個元素有多個訪問者對象訪問。
22、備忘錄(Memento)模式:在不破壞封裝性的前提下,獲取並保存一個對象的內部狀態,以便以后恢復它。
23、解釋器(Interpreter)模式:提供如何定義語言的放法,以及對語言句子的解釋方法,即解釋器。

根據具體功能分類表

 

面向對象設計原則

1、開閉原則:當應用的需求改變時,在不修改軟件實體的源代碼或者二進制代碼的前提下,可以擴展模塊的功能,使其滿足新的需求。

  作用:

    1、方便測試;測試時只需要對擴展的代碼進行測試。

    2、提高代碼的可復用性;粒度越小,被復用的可能性就越大。

    3、提高軟件的穩定性和延續性,易於擴展和維護。

  實現方式:通過“抽象約束、封裝變化”來實現開閉原則。通過接口或者抽象類為軟件實體定義一個相對穩定的抽象層,而將相同的可變因素封裝在相同的具體實現類。

2、里氏替換原則:繼承必須確保超類所擁有的性質在子類中仍然成立。子類可以擴展父類的功能,但不能改變父類原有的功能

  作用:

    1、克服了繼承中重寫父類造成的可復用性變差的缺點

    2、保證了動作正確性。即類的擴展不會給已有的系統引入新的錯誤,降低了代碼出錯的可能性。

  實現方式:繼承,除添加新的方法完成新增功能外,盡量不要重寫父類的方法

3、依賴倒置原則:高層模塊不應該依賴低層模塊,兩者都應該依賴其抽象;抽象不應該依賴細節,細節應該依賴抽象。其核心思想是:要面向接口編程,不要面向實現編程。

  作用:

 

    1、依賴倒置原則可以降低類間的耦合性。

    2、依賴倒置原則可以提高系統的穩定性。

    3、依賴倒置原則可以減少並行開發引起的風險。

    4、依賴倒置原則可以提高代碼的可讀性和可維護性。

  實現方式:

 

    1、每個類盡量提供接口或抽象類,或者兩者都具備。

    2、變量的聲明類型盡量是接口或者是抽象類。

    3、任何類都不應該從具體類派生。

    4、使用繼承時盡量遵循里氏替換原則

4、單一職責原則:一個類應該有且僅有一個引起它變化的原因,否則類應該被拆分。核心就是控制類的粒度大小、將對象解耦、提高其內聚性

  作用:

    1、降低類的復雜度。一個類只負責一項職責,其邏輯肯定要比負責多項職責簡單得多。

    2、提高類的可讀性。復雜性降低,自然其可讀性會提高。

    3、提高系統的可維護性。可讀性提高,那自然更容易維護了。

    4、變更引起的風險降低。變更是必然的,如果單一職責原則遵守得好,當修改一個功能時,可以顯著降低對其他功能的影響。

5、接口隔離原則:客戶端不應該被迫依賴於它不使用的方法,一個類對另一個類的依賴應該建立在最小的接口上

  作用:

    1、將臃腫龐大的接口分解為多個粒度小的接口,可以預防外來變更的擴散,提高系統的靈活性和可維護性。

    2、接口隔離提高了系統的內聚性,減少了對外交互,降低了系統的耦合性。

    3、如果接口的粒度大小定義合理,能夠保證系統的穩定性;但是,如果定義過小,則會造成接口數量過多,使設計復雜化;如果定義太大,靈活性降低,無法提供定制服務,給整體項目帶來無法預料的風險。

    4、使用多個專門的接口還能夠體現對象的層次,因為可以通過接口的繼承,實現對總接口的定義。

    5、能減少項目工程中的代碼冗余。過大的大接口里面通常放置許多不用的方法,當實現這個接口的時候,被迫設計冗余的代碼。

  實現方式:

    1、接口盡量小,但是要有限度。一個接口只服務於一個子模塊或業務邏輯。

    2、為依賴接口的類定制服務。只提供調用者需要的方法,屏蔽不需要的方法。

    3、了解環境,拒絕盲從。每個項目或產品都有選定的環境因素,環境不同,接口拆分的標准就不同深入了解業務邏輯。

    4、提高內聚,減少對外交互。使接口用最少的方法去完成最多的事情。

6、迪米特法則:如果兩個軟件實體無須直接通信,那么就不應當發生直接的相互調用,通過第三方轉發調用降低類之間的耦合度,提高模塊的相對獨立性

  作用:

    1、降低了類之間的耦合度,提高了模塊的相對獨立性。

    2、由於親合度降低,從而提高了類的可復用率和系統的擴展性。

  實現方式: 

7、合成復用原則:在軟件復用時,要盡量先使用組合或者聚合等關聯關系來實現,其次才考慮使用繼承關系來實現。

  作用:

    1、它維持了類的封裝性。因為成分對象的內部細節是新對象看不見的,所以這種復用又稱為“黑箱”復用。

    2、新舊類之間的耦合度低。這種復用所需的依賴較少,新對象存取成分對象的唯一方法是通過成分對象的接口。

    3、復用的靈活性高。這種復用可以在運行時動態進行,新對象可以動態地引用與成分對象類型相同的對象。

  實現方式:將已有的對象納入新對象中,作為新對象的成員對象來實現的,新對象可以調用已有對象的功能,從而達到復用。

 

  對於7種設計原則其各自的側重點不同。其中,開閉原則是總綱,它告訴我們要對擴展開放,對修改關閉;里氏替換原則告訴我們不要破壞繼承體系;依賴倒置原則告訴我們要面向接口編程;單一職責原則告訴我們實現類(方法)要職責單一;接口隔離原則告訴我們在設計接口的時候要精簡單一;迪米特法則告訴我們要降低耦合度;合成復用原則告訴我們要優先使用組合或者聚合關系復用,少用繼承關系復用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM