1. 程式人生 > >面向對象開發中的七大設計原則和23種設計模式

面向對象開發中的七大設計原則和23種設計模式

調停者模式 bili 叠代器模式 erp 策略模式 flyweight 理解 ati 轉換成

一、面向對象開發中的七大設計原則

  軟件開發中最核心的思想就是“高內聚,低耦合”,主要的目的也是為了方便後期的維護和變更。下面的設計原則也是依靠這個核心思想衍生出來的。

  1、單一職責原則【SINGLE RESPONSIBILITY PRINCIPLE】:單一職責原則想表達的核心思想就是“高內聚”,一個模塊只完成一項功能。在面向對象設計中,一個類只應該負責一項職責,如果同時承擔太多職責,就等於把這些職責耦合在了一起。

    後面很可能因為某項職責的變更而導致其他職責的削弱或者抑制其他職責的能力。

  2、裏氏替換原則【LISKOV SUBSTITUTION PRINCIPLE】:任何時候都可以用子類型來替換父類型。

  3、依賴倒置原則【DEPENDENCE INVERSION PRINCIPLE】:面向接口編程,聲明方法的參數類型、方法的返回類型、變量的引用類型時,盡可能使用抽象類型而不用具體類型,因為抽象類型可以被它的任何一個子類型所替代,請參考下面的裏氏替換原則。

  4、接口隔離原則【INTERFACE SEGREGATION PRINCIPLE】:建立單一接口,不要建立龐大臃腫的接口,盡量細化接口。

  5、迪米特法則【LOW OF DEMETER】:迪米特法則又叫最少知識原則,一個對象應當對其他對象有盡可能少的了解。(低耦合)

  6、開閉原則【OPEN CLOSE PRINCIPLE】 一個軟件實體如類、模塊和函數應該對擴展開放,對修改關閉。

  7、組合/聚合復用原則【Composition/Aggregation Reuse Principle(CARP) 】:盡量使用組合和聚合,少使用繼承的關系來達到復用的原則。類與類之間簡單的說有三種關系,IS-A關系、HAS-A關系、USE-A關系,分別代表繼承、關聯和依賴。

   其中,關聯關系根據其關聯的強度又可以進一步劃分為關聯、聚合和合成,但說白了都是HAS-A關系,合成聚合復用原則想表達的是優先考慮HAS-A關系而不是IS-A關系復用代碼

二、23種設計模式

  設計模式是一套被反復使用的代碼設計經驗的總結,是對上面的設計原則的進一步細化,使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。設計模式使人們可以更加簡單方便的復用成功的設計和體系結構。將已證實的技術表述成設計模式也會使新系統開發者更加容易理解其設計思路。這23中設計模式概括起來可以分為三大類:

    1、創建型模式(5種):

      1.1、工廠方法模式(factory method pattern):如果需要創建大量對象,並且這些類都實現了共同的接口,那麽可以用工廠方法模式來進行創建。

         工廠方法模式存在缺陷,由於對象的創建依賴工廠的方法,如果需要創建新的類的實例,需要修改工廠類的方法,這樣違反了開閉原則。

      1.2、抽象工廠模式(Abstract factory pattern):由於工廠方法模式違反了開閉原則,那麽我們就可以將工廠也進行抽象,如果要創建新的類型的對象,就創建新的對應的工廠類。這就是抽象工廠模式,該模式的缺點是創建的類比較多。

      1.3、單例模式(Singleton pattern):單例對象能保證在一個JVM中,該類只有一個實例存在。

      1.4、建造者模式(Builder pattern):工廠類模式提供的是創建單個類的模式,而建造者模式則是將各種產品集中起來進行管理,用來創建復合對象。建造者模式也可以看作是對抽象工廠模式的整合,創建較復雜的對象。

      1.5、原型模式(prototype pattern):該模式的思想就是將一個對象作為原型,對其進行復制、克隆,產生一個和原對象類似的新對象。

    2、結構型模式(7種):

      2.1、適配器模式(Adapter pattern):將某個類的接口轉換成客戶端期望的另一個接口表示,目的是消除由於接口不匹配所造成的類的兼容性問題。

      2.2、裝飾器模式(Decorator pattern):動態的為一個對象增加新的功能,要求裝飾對象和被裝飾對象實現同一個接口,裝飾對象持有被裝飾對象的實例。

      2.3、代理模式(Proxy pattern):代理模式就是多一個代理類出來,替原對象進行一些操作,實際操作的還是原來的對象。就像明星的經紀人一樣,經紀人就是明星的代理。

      2.4、外觀模式(Facade pattern):也叫門面模式,為子系統中的一組接口提供一個一致的界面,定義一個高層接口,這個接口使得這一子系統更加容易使用。 就像去公司面試或者拜訪只需要找前臺就行,前臺就算是公司的一個門面。

      2.5、橋接模式(Bridge pattern):橋接模式就是把事物和其具體實現分開,使他們可以各自獨立的變化。

      2.6、組合模式(composite pattern):組合模式將對象組織到樹結構中,可以用來描述整體與部分的關系。組合模式就是一個處理對象的樹結構的模式。合成模式把部分與整體的關系用樹結構表示出來。

        組合模式使得客戶端把一個個單獨的成分對象和由他們復合而成的合成對象同等看待。經典的例子就是部門樹。

      2.7、享元模式(Flyweight Pattern):主要通過實現對象的共享來減少創建對象的數量,以減少內存占用和提高性能。如共享池,當系統中對象多的時候可以減少內存的開銷,通常與工廠模式一起使用。

    3、行為型模式(11種):

      3.1、策略模式(strategy pattern):策略模式針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們可以相互替換。策略模式把行為和環境分開。

         環境類負責維持和查詢行為類,各種算法在具體的策略類中提供。由於算法和環境獨立開來,算法的增減,修改都不會 影響到環境和客戶端。

      3.2、模板方法模式(Template pattern):模板方法模式預備一個抽象類,在該抽象類的方法中只實現部分邏輯,然後聲明一些抽象方法來迫使子類實現剩余的邏輯。

        不同的子類可以以不同 的方式實現這些抽象方法,從而對剩余的邏輯有不同的實現。先制定一個頂級邏輯框架,而將邏輯的細節留給具體的子類來實現。

      3.3、觀察者模式(observer pattern):讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知所有觀察者對象,使他們能夠自動更新自己。

      3.4、叠代器模式(iterator pattern):叠代器模式可以順序訪問一個聚集中的元素而不必暴露聚集的內部表象。多個對象聚在一起形成的總體稱之為聚集,聚集對象是能夠包容一組對象的容器對象。

         叠代子模式將叠代邏輯封裝到一個獨立的子對象中,從而與聚集本身隔開。叠代器模式簡化了聚集的界面。每一個聚集對象都可以有一個或一個以上的叠 代子對象,每一個叠代子的叠代狀態可以是彼此獨立的。叠代算法可以獨立於聚集角色變化。

      3.5、責任鏈模式(Chain of responsibility pattern):在 責任鏈模式中,很多對象由每一個對象對其下家的引用而接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。

        客戶並不知道鏈上的哪 一個對象終極處理這個請求,系統可以在不影響客戶的情況下動態的重新組織鏈和分配責任。處理者有兩個選擇:承擔責任或者把責任推給下家。一個請求可以終 極不被任何接收端對象所接受。

      3.6、命令模式(Command pattern):命令模式把一個請求或者操作封裝到一個對象中。命令模式把發出命令的責任和執行命令的責任分割開,委派給不同的對象。

         命令模式答應請求的一方和發送的一方獨立開來,使得請求的一方不必知道接收請求的一方的接 口,更不必知道請求是怎麽被接收,以及操縱是否執行,何時被執行以及是怎麽被執行的。系統支持命令的撤消。

      3.7、備忘錄模式(Memento pattern):保存一個對象的某個狀態,以便在適當的時候恢復對象。

      3.8、狀態模式(State pattern): 狀態模式的意圖是讓一個對象在其內部狀態改變的時候,其行為也隨之改變。狀態模式需要對每一個系統可能取得的狀態創立一個狀態類的子類。當系統的狀態變化時,系統便 改變所選的子類。

      3.9、訪問者模式(visitor pattern):訪問者模式的目的是封裝一些施加於某種數據結構元素之上的操作。一旦這些操縱需要修改的話,接受這個操作的數據結構可以保持 不變。

         訪問者模式適用於數據結構相對未定的系統,它把數據結構和作用於結構上的操作之間的耦合解脫開,使得操作集合可以相對自由的演化。訪問者模式使得增 加新的操作變的很輕易,就是增加一個新的訪問者類。

         訪問者模式將有關的行為集中到一個訪問者對象中,而不是分散到一個個的節點類中。當使用訪問者模式時, 要將盡可能多的對象瀏覽邏輯放在訪問者類中,而不是放到它的子類中。

         訪問者模式可以跨過幾個類的等級結構訪問屬於不同的等級結構的成員類。

      3.10、中介者模式(Mediator pattern):也叫調停者模式,用來降低多個對象和類之間的通信復雜性。這種模式提供了一個中介類,該類通常處理不同類之間的通信,並支持松耦合,使代碼易於維護。

      3.11、解釋器模式(Interpreter pattern):定一個語言後,解釋器模式可以定義出其文法的一種表示,並同時提供一個解釋器。客戶端可以使用這個解釋器來解釋這個語言中的句子。

         解釋器 模式將描述怎樣在有了一個簡單的文法後,使用模式設計解釋這些語句。在解釋器模式裏面提到的語言是指任何解釋器對象能夠解釋的任何組合。

         在解釋器模式中需 要定義一個代表文法的命令類的等級結構,也就是一系列的組合規則。每一個命令對象都有一個解釋方法,代表對命令對象的解釋。

         命令對象的等級結構中的對象的 任何排列組合都是一個語言。

面向對象開發中的七大設計原則和23種設計模式