設計模式 - 設計原則

HOsystem發表於2021-04-14


設計模式

設計原則

在物件導向設計模式中存在的是五大原則和一個法則。

  • 單一職責原則 SRP(Single Responsibilities Principle)
  • 介面隔離原則 ISP(Interface Segregation Principle)
  • 依賴倒置原則 DIP(Dependence Inversion Principle)
  • 里氏替換原則 LSK(Liskov Substitution Principle)
  • 開閉原則 OCP(Open Close Principle)
  • 迪米特法則 DP (Demeter Principle)

單一職責原則 SRP(Single Responsibilities Principle)

# 1.單一職責原則
- 參考文件:https://baike.baidu.com/item/%E5%8D%95%E4%B8%80%E8%81%8C%E8%B4%A3%E5%8E%9F%E5%88%99/9456515?fr=aladdin

- 一個類只負責一項職責。

# 2.單一職責優點
- 降低類的複雜度,一個類只負責一個職責。這樣寫出來的程式碼邏輯肯定要比負責多項職責簡單得多。

- 提高類的可讀性,提高系統的可維護性。

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

需要說明的一點是,單一職責原則不只是物件導向程式設計思想所特有的,只要是模組化的程式設計,都適用單一職責原則。比如說單一職責原則不僅僅適用於類,還適用於方法。

# 3.單一職責注意事項
通常情況下,我們應當遵守單一職責原則,只有邏輯足夠簡單,才可以在程式碼級違反單一職責原則;只有類中方法數量足夠少,可以在方法級別保持單一職責原則。

介面隔離原則 ISP(Interface Segregation Principle)

# 1.介面隔離原則
- 參考文件:https://baike.baidu.com/item/%E6%8E%A5%E5%8F%A3%E9%9A%94%E7%A6%BB%E5%8E%9F%E5%88%99/3104602?fr=aladdin

- 一個類對另一個類的依賴應該建立在最小的介面上。

- 一個介面代表一個角色,不應當將不同的角色都交給一個介面。沒有關係的介面合併在一起,形成一個臃腫的大介面,這是對角色和介面的汙染。

- “不應該強迫客戶依賴於它們不用的方法。介面屬於客戶,不屬於它所在的類層次結構。”這個說得很明白了,再通俗點說,不要強迫客戶使用它們不用的方法,如果強迫使用者使用它們不使用的方法,那麼這些客戶就會面臨由於這些不使用的方法的改變所帶來的改變。

依賴倒置原則 DIP(Dependence Inversion Principle)

# 1.倒轉依賴原則
- 參考文件:https://baike.baidu.com/item/%E4%BE%9D%E8%B5%96%E5%80%92%E7%BD%AE%E5%8E%9F%E5%88%99/6189149?fr=aladdin

- 程式要依賴於抽象介面,不要依賴於具體實現。簡單的說就是要求對抽象進行程式設計,不要對實現進行程式設計,這樣就降低了客戶與實現模組間的耦合。

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

- 抽象不應該依賴細節,細節應該依賴抽象。

- 依賴倒轉(倒置)的中心思想是面向介面程式設計。

- 依賴倒轉原則是基於這樣的設計理念:相對於細節的多變性,抽象的東西要穩定的多。以抽象為基礎搭建的架構比以細節為基礎的架構要穩定的多。在java中,抽象指的是介面或抽象類,細節就是具體的實現類。

- 使用介面或抽象類的目的是制定好規範,而不涉及任何具體的操作,把展現細節的任務交給他們的實現類去完成。

# 2.倒轉依賴方式
- 介面傳遞

- 構造方法傳遞

- setter方式傳遞

# 3.倒轉依賴注意事項
- 低層模組儘量都要有抽象類或介面,或者兩者都有,程式穩定性更好。

- 變數的宣告型別儘量是抽象類或介面, 這樣我們的變數引用和實際物件間,就存在一個緩衝層,利於程式擴充套件和優化。

- 繼承時遵循里氏替換原則。

裡式替換原則 LSK(Liskov Substitution Principle)

# 1.裡式替換原則
- 參考文件:https://baike.baidu.com/item/%E9%87%8C%E6%B0%8F%E6%9B%BF%E6%8D%A2%E5%8E%9F%E5%88%99/3744239?fr=aladdin

- 繼承在給程式設計帶來便利的同時,也帶來了弊端。比如使用繼承會給程式帶來侵入性,程式的可移植性降低,增加物件間的耦合性,如果一個類被其他的類所繼承,則當這個類需要修改時,必須考慮到所有的子類,並且父類修改後,所有涉及到子類的功能都有可能產生故障。

- 在使用繼承時,遵循里氏替換原則,在子類中儘量不要重寫父類的方法。

- 里氏替換原則表明繼承實際上讓兩個類耦合性增強了,在適當的情況下,可以通過聚合、組合、依賴 來解決問題。

- 重寫父類的方法,可能會造成原有功能出現錯誤。所以父類和子類都繼承一個更通俗的基類,原有的繼承關係去掉,採用依賴、聚合、組合等關係代替。

開閉原則 OCP(Open Close Principle)

# 1.開閉原則
- 參考文件:https://baike.baidu.com/item/%E5%BC%80%E9%97%AD%E5%8E%9F%E5%88%99/2828775?fr=aladdin

-開閉原則規定“軟體中的物件(類,模組,函式等等)應該對於擴充套件是開放的,但是對於修改是封閉的”。

- 當軟體需要變化時,儘量通過擴充套件軟體實體的行為來實現變化,而不是通過修改已有的程式碼來實現變化。

- 程式設計中遵循其它原則,以及使用設計模式的目的就是遵循開閉原則。

迪米特法則 DP (Demeter Principle)

# 1.迪米特法則
- 參考文件:https://baike.baidu.com/item/%E8%BF%AA%E7%B1%B3%E7%89%B9%E6%B3%95%E5%88%99/2107000?fr=aladdin

- 迪米特法則(Law of Demeter)又叫作最少知識原則(The Least Knowledge Principle),一個類對於其他類知道的越少越好,就是說一個物件應當對其他物件有儘可能少的瞭解,只和朋友通訊,不和陌生人說話。英文簡寫為: LOD。

- 迪米特法則的核心是降低類之間的耦合。

- 由於每個類都減少了不必要的依賴,因此迪米特法則只是要求降低類間(物件間)耦合關係, 並不是要求完全沒有依賴關係。

UML

# 1.UML
- 參考文件:https://baike.baidu.com/item/%E7%BB%9F%E4%B8%80%E5%BB%BA%E6%A8%A1%E8%AF%AD%E8%A8%80/3160571?fromtitle=UML&fromid=446747&fr=aladdin

- UML採用一組圖形符號來描述軟體模型,這些圖形符號具有簡單、直觀和規範的特點,開發人員學習和掌握起來比較簡單。

# 2.類圖相關概念
- 依賴關係(Dependence)

- 泛化關係(generalization)

- 實現關係(Implementation)

- 關聯關係(Association)

- 聚合關係(Aggregation)

- 組合關係(Composition)

設計模式型別

建立型模式

這些設計模式提供了一種在建立物件的同時隱藏建立邏輯的方式,而不是使用 new 運算子直接例項化物件。這使得程式在判斷針對某個給定例項需要建立哪些物件時更加靈活。

建立型模式提供建立物件的機制, 能夠提升已有程式碼的靈活性和可復⽤性。

- 工廠模式(Factory Pattern)
- 抽象工廠模式(Abstract Factory Pattern)
- 單例模式(Singleton Pattern)
- 建造者模式(Builder Pattern)
- 原型模式(Prototype Pattern)

61B168DB-31DE-4538-B992-DCBE4F826F16.png

結構型模式

這些設計模式關注類和物件的組合。繼承的概念被用來組合介面和定義組合物件獲得新功能的方式。

結構型模式介紹如何將物件和類組裝成較⼤的結構, 並同時保持結構的靈活和⾼效。

- 介面卡模式(Adapter Pattern)
- 橋接模式(Bridge Pattern)
- 過濾器模式(Filter、Criteria Pattern)
- 組合模式(Composite Pattern)
- 裝飾器模式(Decorator Pattern)
- 外觀模式(Facade Pattern)
- 享元模式(Flyweight Pattern)
- 代理模式(Proxy Pattern)

Dingtalk_20210201161425.jpg

行為型模式

這些設計模式特別關注物件之間的通訊。

行為型模式負責物件間的⾼效溝通和職責委派。

- 責任鏈模式(Chain of Responsibility Pattern)
- 命令模式(Command Pattern)
- 直譯器模式(Interpreter Pattern)
- 迭代器模式(Iterator Pattern)
- 中介者模式(Mediator Pattern)
- 備忘錄模式(Memento Pattern)
- 觀察者模式(Observer Pattern)
- 狀態模式(State Pattern)
- 空物件模式(Null Object Pattern)
- 策略模式(Strategy Pattern)
- 模板模式(Template Pattern)
- 訪問者模式(Visitor Pattern)

869109E2-3012-4653-91C0-0BC8EBDFFF84.png

JavaEE模式

這些設計模式特別關注表示層。這些模式是由 Sun Java Center 鑑定的。

- MVC 模式(MVC Pattern)
- 業務代表模式(Business Delegate Pattern)
- 組合實體模式(Composite Entity Pattern)
- 資料訪問物件模式(Data Access Object Pattern)
- 前端控制器模式(Front Controller Pattern)
- 攔截過濾器模式(Intercepting Filter Pattern)
- 服務定位器模式(Service Locator Pattern)
- 傳輸物件模式(Transfer Object Pattern)

相關文章