設計模式-01-概述

概述

設計模式是前人對代碼開發經驗的總結,是解決一系列問題的套路。 是一套解決代碼可複用性、可維護性、可讀性、穩健性以及安全性的安全的解決方案。編程

1995年,GoF(Gang of Four)合做出版了《設計模式:可複用面向對象軟件的基礎》一書,共收錄了23種設計模式,今後創建了軟件設計領域的里程碑,江湖人稱[GoF設計模式]。設計模式

這23種設計模式的本質是對面向對象設計原則的運用,是對類的繼承性、封裝性和多態性,以及類的關聯關係和組合關係的充分理解。每個模式描述了一個在咱們周圍重複出現的問題,以及該問題的解決方案的核心,這樣子你就能一次又一次高效地解決問題。安全

軟件研發是複雜的

軟件工程是複雜的,而複雜的根原本源是改變。這些改變包含客戶需求的變化,技術平臺的變化,開發團隊的變化,市場環境的變化函數

如何解決複雜問題

人類解決複雜問題通常有兩種思路:一種是分解,一種是泛化。設計

  • 分解

將複雜問題分解爲一系列能解決的小問題,而後分而治之。code

  • 抽象

因爲不能徹底掌握複雜對象的全部細節,所以選擇忽視了它的非本質因素,而去處理泛化和理想化了模型。orm

設計模式要實現的目的

如上所述,設計模式要解決的問題是程序的複用性、可拓展性、可讀性,其中最重要的就是複用性對象

可複用性

即對於不一樣的模塊要實現相同的功能,不該該複製代碼,而是要複用代碼blog

編程大師Martin Folwer說過,代碼的壞味道有不少種,而首當其衝的是代碼重複(duplicate code)。繼承

Why Design Pattern

變化是複用的天敵,面向對象設計最大的優點在於:迎合變化

六大設計原則

設計原則比設計模式更重要。全部的設計模式都遵循設計原則,理解設計原則未來咱們本身就能設計出各類各樣的涉及模式。

6大設計原則分別是:

  • 依賴倒置原則
  • 開閉原則
  • 單一職責
  • 迪米特法則
  • 里氏替換原則
  • 接口隔離原則

依賴倒置原則(DIP | Dependency Iversion Principle)

高層模塊(穩定)不該該依賴於底層模塊(變化),而應該依賴於抽象。
抽象(穩定)不該該依賴於具體(變化),具體應該依賴於抽象。

如第一節所說,軟件設計是複雜的,複雜的緣由是開發過程當中的各類變化。雖然軟件開發充滿變化,可是其中仍是有不變的地方,所以就須要把變化的部分和不變的部分進行隔離。
從宏觀上來講,這裏說的變化就是低層模塊,穩定指的是高層模塊。
從語言層面來講,變化指的是具體的類,穩定指的是抽象,如接口、抽象類。

開閉原則(OCP | Open-Closed Principle)

In object-oriented programming, the open/closed principle states "software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification"; that is, such an entity can allow its behaviour to be extended without modifying its source code.
--- from Wikipedia

在面向對象的編程中,開閉原則說明:軟件實體(模塊,類,函數等)應該對拓展開放,對修改關閉,即:一個實體可以不動他的源代碼進行拓展。

意思就是:要使用拓展的方式來應對的需求的變化。

TIP

這裏指的修改是二進制編譯層面的,意思就是你修改了這個東西須要從新哪些文件才能夠從新使用。

單一職責(SRP | Single Resonsibility Principle)

a class should only have one responsibility, which is further defined by Martin as ‘one reason to change
--- from Wikipedia

一個類應該只有一個職責。 這一原則Martin拓展爲: 一個軟件實體應該只有引發他改變的緣由。

迪米特法則(Law of Demeter)

Law of Demeter or Least of Knowledge is a design principle for developing software, particular Object-oriented-programs.In its general form, the LoD is a specific case of loose coupling .

  • Each unit should have only limited knowledge about other units: only units "closely" related to the current unit.
  • Each unit should only talk to its friends; don't talk to strangers.
  • Only talk to your immediate friends.

迪米特法則(又稱最少知道原則)是一個軟件開發的設計原則,特別是面向對象編程,軟件實體之間應該儘量值暴露須要暴露的。

又稱最少知道原則(Least know principles)。

里氏替換原則(LSP | Liskov Substitude Principle)

軟件單元中子類應該能夠替換全部的父類。 即,子類應該具備父類的全部功能。

接口隔離原則(Interface Segregation Principle)

不該該強迫客戶程序依賴它們不用的方法。接口應該小而完備。

另外還有兩個應該引發注意的點,雖然他們不是設計原則:

  • 優先使用對象組合,而不是繼承
    • 類繼承一般爲了「白箱複用」,對象組合一般是「黑箱複用」
    • 繼承在某種程度上破壞了封裝性,子類父類耦合度高
    • 而對象組合則只要求被組合的對象具備良好定義的接口,耦合度低。
  • 封裝變化點點
    • 使用封裝來建立對象之間的分界層,讓設計者能夠在分界層的一側修改,而不會對另外一側產生不良的影響,從而下降類層次的鬆耦合。

23種設計模式分類

在面向對象的設計模式中,能夠按照目的分爲三類:

  • 建立型
  • 結構型
  • 行爲型

具體可見以下這腦圖:

相關文章
相關標籤/搜索