設計模式總結
一、七大原則
在實際開發過程中,並不是一定要求所有程式碼都遵循設計原則,而是要綜合考慮人力、時間、成本、品質,不刻意追求完美,要在適當的場景遵循設計原則。這體現的是一種平衡取捨,可以幫助我們設計出更加優雅的程式碼結構。各種原則要求的側重點不同,下面我們分別用一句話歸納總結軟體設計模式的七大原則,如下表所示。
實際上,這些原則的目的只有一個:降低對象之間的耦合,增加程式的可復用性、可擴展性和可維護性。在程式設計時,我們應該將程式功能最小化,每個類只干一件事。若有類似功能基礎之上添加新功能,則要合理使用繼承。對於多方法的調用,要會運用介面,同時合理設置介面功能與數量。最後類與類之間做到低耦合高內聚。
二、設計模式分類
1.創建型模式
創建型模式,就是創建對象的模式,抽象了實例化的過程。它幫助一個系統獨立於如何創建、組合和表示它的那些對象。關注的是對象的創建,創建型模式將創建對象的過程進行了抽象,也可以理解為將創建對象的過程進行了封裝,作為客戶程式僅僅需要去使用對象,而不再關係創建對象過程中的邏輯。
社會化的分工越來越細,自然在軟體設計方面也是如此,因此對象的創建和對象的使用分開也就成為了必然趨勢。因為對象的創建會消耗掉系統的很多資源,所以單獨對對象的創建進行研究,從而能夠高效地創建對象就是創建型模式要探討的問題。這裡有6個具體的創建型模式可供研究,它們分別是:
- 簡單工廠模式(Simple Factory)
- 工廠方法模式(Factory Method)
- 抽象工廠模式(Abstract Factory)
- 創建者模式(Builder)
- 原型模式(Prototype)
- 單例模式(Singleton)
2.結構型模式
結構型模式是為解決怎樣組裝現有的類,設計它們的交互方式,從而達到實現一定的功能目的。結構型模式包容了對很多問題的解決。例如:擴展性(外觀、組成、代理、裝飾)、封裝(適配器、橋接)。
在解決了對象的創建問題之後,對象的組成以及對象之間的依賴關係就成了開發人員關注的焦點,因為如何設計對象的結構、繼承和依賴關係會影響到後續程式的維護性、程式碼的健壯性、耦合性等。對象結構的設計很容易體現出設計人員水平的高低,這裡有7個具體的結構型模式可供研究,它們分別是:
- 外觀模式/門面模式(Facade門面模式)
- 適配器模式(Adapter)
- 代理模式(Proxy)
- 裝飾模式(Decorator)
- 橋樑模式/橋接模式(Bridge)
- 組合模式(Composite)
- 享元模式(Flyweight)
3.行為型模式
行為型模式涉及到演算法和對象間職責的分配,行為模式描述了對象和類的模式,以及它們之間的通訊模式,行為模式刻划了在程式運行時難以跟蹤的複雜的控制流可分為行為類模式和行為對象模式。1. 行為類模式使用繼承機制在類間分派行為。2. 行為對象模式使用對象聚合來分配行為。一些行為對象模式描述了一組對等的對象怎樣相互協作以完成其中任何一個對象都無法單獨完成的任務。
在對象的結構和對象的創建問題都解決了之後,就剩下對象的行為問題了,如果對象的行為設計的好,那麼對象的行為就會更清晰,它們之間的協作效率就會提高,這裡有11個具體的行為型模式可供研究,它們分別是:
- 模板方法模式(Template Method)
- 觀察者模式(Observer)
- 狀態模式(State)
- 策略模式(Strategy)
- 職責鏈模式(Chain of Responsibility)
- 命令模式(Command)
- 訪問者模式(Visitor)
- 調停者模式(Mediator)
- 備忘錄模式(Memento)
- 迭代器模式(Iterator)
- 解釋器模式(Interpreter)
三、三者之間的區別和聯繫
創建型模式提供生存環境,結構型模式提供生存理由,行為型模式提供如何生存。
- 創建型模式為其他兩種模式使用提供了環境。
- 結構型模式側重於介面的使用,它做的一切工作都是對象或是類之間的交互,提供一個門。
- 行為型模式顧名思義,側重於具體行為,所以概念中才會出現職責分配和演算法通訊等內容。
四、一句話歸納設計模式
五、設計模式對比
1.策略模式 VS 委派模式
- 共同點:行為型模式
- 不同點:策略模式關注能否相互替換,委派模式關注分發和調度的過程
- 關聯:切換的上下文
2.工廠方法模式 VS 抽象工廠模式
- 共同點:1、創建型模式;2、職責相同
- 不同點:創建出來的產品擴展程度不一樣,工廠方法單維度擴展,抽象工廠可以實現多維度擴展
- 關聯:工廠方法很多情況下會作為抽象工廠的子類
3.策略模式vs代理模式
- 不同:策略行為型、代理是結構型
4.中介模式VS橋接模式
- 共同點:具備兩個對象建立聯繫
- 不同點:1、行為型VS結構型;2、中介者將多維度網狀結構的對象建立聯繫;橋接模式將兩個維度(抽象和具象)建立聯繫
- 關聯:中介者是更複雜的橋
5.代理模式VS委派模式
- 共同點:都有保護目標對象的特性
- 不同點:1、結構型VS行為型;2、職責不同,委派模式不對目標的功能做增強,代理是一定要幹活的
- 關聯:委派就是全權靜態代理,沒有增強的代理就是委派
6.代理模式vs中介者模式
- 共同點:都有保護目標對象的特性
- 不同點:1、結構型VS行為型;2、干預程度不同,代理是「媒婆」,中介者是「不負責任的媒婆」;3、代理參與其中的過程,中介者只做牽線搭橋,不參與過程
- 關聯:中介者是一種面向更加複雜的對象關係的全權靜態代理(委派)
7.橋接模式 VS 適配器模式
- 共同點:1、都是結構型 ;2、都存在對象的間接引用關係;
- 不同點:1、使用場景不同,適配器希望已有程式碼穩定的,橋接希望已有程式碼是擴展的;2、原則不同:橋接不推薦使用繼承的,適配器會採用繼承
8.建造者VS工廠模式
- 共同點:1、都屬於創建型;2、職責相同,都是將創建產品的細節封裝起來;
- 不同點:1、目的不同:工廠模式希望創建標品(標準產品)、建造者希望創建個性化產品(訂製化);2、產品複雜程度不一樣:工廠模式產品相對單一,建造者產品粒度更細
- 關聯:工廠一般會設置為單例,而建造者一般是多例
9.代理模式VS適配器模式
- 共同點:1、結構型模式;2、包裝器模式的實現;3、都起到了隱藏和保護目標對象的作用
- 不同點:目的不同,代理為了功能增強、適配器為了解決兼容問題
- 關聯:對象適配器其實就是靜態代理的一種實現
10.適配器VS裝飾器
- 共同點:1、都屬於結構型模式;2、包裝器模式的一種
- 不同點:1、裝飾器同宗同源,適配器純屬偽裝;2、目的不同:適配器是為兼容(轉換)、裝飾器是為增強(不改變原有功能);
- 關聯:結構上有點類似
11.橋接模式VS組合模式
- 共同點:都屬於行為型模式
- 不同點:橋接模式的目的是將兩個繼承體系建立聯繫,組合模式的目的不是為了建立連接,而是統一的API
- 關聯:關聯性不大
12.策略模式VS模板方法模式
- 共同點:1、都屬於行為型模式;2、可以將底層和應用程式碼的某些細節分離
- 不同點:1、開放程度不一樣:策略模式只允許用戶選,模板模式允許微調
- 關聯:混合使用