1. 程式人生 > >Java 設計模式總結

Java 設計模式總結

 

前言

一、簡介

二、設計模式的型別

三、23種設計模式簡介

四、設計模式七大原則

五、常用設計模式

六、原始碼地址

七、參考文件

八、內容推薦


前言

1、設計模式來源?
        答:設計模式來自於建築領域,作為軟體工程的一個分支。1995年由GOF收集整理了23種設計模式並出版了《Design Patterns: Elements of Reusable Object-Oriented Software》一書。
2、什麼是設計模式?
        答:設計模式(Design Pattern)是一套被反覆使用、多數人知曉的、經過分類的、程式碼設計經驗的總結。
3、為什麼要使用設計模式(目的)?


        答:為了程式碼可重用性、增加可維護性,讓程式碼更容易被他人理解、保證程式碼可靠性。設計模式使程式碼編寫真正工程化。
4、怎麼實現程式碼可重用性?
        答:遵循設計模式七大原則(單一職責原則、開閉原則、里氏代換原則、依賴倒轉原則、介面隔離原則、迪米特法則、合成/聚合複用原則)。

一、簡介

GoF(“四人組”,又稱Gang of Four,即Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四人)的《設計模式》,原名《Design Patterns: Elements of Reusable Object-Oriented Software》1995年出版,出版社:Addison Wesly Longman.Inc,第一次將設計模式提升到理論高度,並將之規範化。該書提出了23種基本設計模式。時至今日,在可複用面向物件軟體的發展過程中,新的設計模式仍然不斷出現。

設計模式是軟體開發人員在軟體開發過程中面臨一般問題的解決方案。這些解決方案是眾多軟體開發人員經過相當長的一段時間的試驗和錯誤總結出來的。

好了,介紹完了。真正的好戲要開始了,是不是特別激動...

二、設計模式的型別

23種設計模式大體上分為三大類:

  1. 建立型模式(5種):工廠方法模式,抽象工廠模式,單例模式,建造者模式,原型模式。
  2. 結構型模式(7種):介面卡模式,裝飾器模式,代理模式,外觀模式,橋接模式,組合模式,享元模式。
  3. 行為型模式(11種):策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式。

大家可以看下這個表,是從菜鳥教程上獲取的,多了兩種模式(過濾器模式、空物件模式)不屬於GOF23種設計模式。

三、23種設計模式簡介

按字典序排列簡介如下:

  1. Abstract Factory(抽象工廠模式):提供一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。
  2. Adapter(介面卡模式):將一個類的介面轉換成客戶希望的另外一個介面。Adapter模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。
  3. Bridge(橋接模式):將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
  4. Builder(建造者模式):將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
  5. Chain of Responsibility(責任鏈模式):為解除請求的傳送者和接收者之間耦合,而使多個物件都有機會處理這個請求。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個物件處理它。
  6. Command(命令模式):將一個請求封裝為一個物件,從而使你可用不同的請求對客戶進行引數化;對請求排隊或記錄請求日誌,以及支援可取消的操作。
  7. Composite(組合模式):將物件組合成樹形結構以表示“部分-整體”的層次結構。它使得客戶對單個物件和複合物件的使用具有一致性。
  8. Decorator(裝飾模式):動態地給一個物件新增一些額外的職責。就擴充套件功能而言, 它比生成子類方式更為靈活。
  9. Facade(外觀模式):為子系統中的一組介面提供一個一致的介面,Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。
  10. Factory Method(工廠模式):定義一個用於建立物件的介面,讓子類決定將哪一個類例項化。Factory Method使一個類的例項化延遲到其子類。
  11. Flyweight(享元模式):運用共享技術有效地支援大量細粒度的物件。
  12. Interpreter(解析器模式):給定一個語言, 定義它的文法的一種表示,並定義一個直譯器, 該直譯器使用該表示來解釋語言中的句子。
  13. Iterator(迭代器模式):提供一種方法順序訪問一個聚合物件中各個元素,而又不需暴露該物件的內部表示。
  14. Mediator(中介模式):用一箇中介物件來封裝一系列的物件互動。中介者使各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動。
  15. Memento(備忘錄模式):在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到儲存的狀態。
  16. Observer(觀察者模式):定義物件間的一種一對多的依賴關係,以便當一個物件的狀態發生改變時,所有依賴於它的物件都得到通知並自動重新整理。
  17. Prototype(原型模式):用原型例項指定建立物件的種類,並且通過拷貝這個原型來建立新的物件。
  18. Proxy(代理模式):為其他物件提供一個代理以控制對這個物件的訪問。
  19. Singleton(單例模式):保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。 單例模式是最簡單的設計模式之一,但是對於Java的開發者來說,它卻有很多缺陷。在九月的專欄中,David Geary探討了單例模式以及在面對多執行緒(multi-threading)、類裝載器(class loaders)和序列化(serialization)時如何處理這些缺陷。
  20. State(狀態模式):允許一個物件在其內部狀態改變時改變它的行為。物件看起來似乎修改了它所屬的類。
  21. Strategy(策略模式):定義一系列的演算法,把它們一個個封裝起來, 並且使它們可相互替換。本模式使得演算法的變化可獨立於使用它的客戶。
  22. Template Method(模板方法模式):定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。Template Method使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。
  23. Visitor(訪問者模式):表示一個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。

四、設計模式七大原則

之前看了許多部落格與文件大部分都是在寫六大原則不是少了單一職責原則就是少了合成/聚合複用原則。
其實許多書也都是在寫六大原則不過我感覺還是少了一種,也有許多部落格詳細描述了七大原則。
這邊就暫時定為七大原則,並簡單介紹一下,詳情還請找度娘。

(1)單一職責原則(SRP, Single Responsibility Principle)

定義:一個類應該有且只有一個變化的原因。

單一職責原則將不同的職責分離到單獨的類,每一個職責都是一個變化的中心。

優點:1、降低類的複雜度;2、提高類的可讀性,提高系統的可維護性;3、降低變更引起的風險(降低對其他功能的影響)。

(2)開閉原則(Open Close Principle)

此原則是由Bertrand Meyer提出。

定義:對擴充套件開放,對修改關閉。在程式需要進行拓展的時候,不能去修改原有的程式碼,實現一個熱插拔的效果。

簡而言之,儘量在不修改原始碼的情況下進行擴充套件。

(3)里氏代換原則(Liskov Substitution Principle)

此原則是由Barbara Liskov提出,是對開閉原則的補充。實現開閉原則的關鍵步驟就是抽象化,而基類與子類的繼承關係就是抽象化的具體實現,所以里氏代換原則是對實現抽象化的具體步驟的規範。

定義:任何基類可以出現的地方,子類一定可以出現。只有當派生類可以替換掉基類,且軟體單位的功能不受到影響時,基類才能真正被複用,而派生類也能夠在基類的基礎上增加新的行為。

(4)依賴倒轉原則(Dependence Inversion Principle)

定義:針對介面程式設計,依賴於抽象而不依賴於具體。

依賴倒置原則包含三層含義:1、高層模組不應該依賴低層模組,兩者都應該依賴其抽象;2、抽象不應該依賴細節;3、細節應該依賴抽象。

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

定義:使用多個隔離的介面,比使用單個介面要好。可以降低類之間的耦合度。

簡而言之:客戶端不應該依賴它不需要的介面;一個類對另一個類的依賴應該建立在最小的介面上。

把一個複雜的介面拆分為獨立的幾個介面,客戶端只需實現所需的介面就行。

(6)迪米特法則,又稱最少知識原則(Least Knowledge Principle)

解決問題:類與類之間的關係越密切,耦合度越大,當一個類發生改變時,對另一個類的影響也越大。需降低耦合採用迪米特法則

定義:一個實體應當儘量少地與其他實體之間發生相互作用,使得系統功能模組相對獨立。

(7)合成/聚合複用原則(Composite Reuse Principle)

合成/聚合複用原則經常又叫做合成複用原則

定義:在一個新的物件裡面使用一些已有的物件,使之成為新物件的一部分;新的物件通過向這些物件的委派達到複用已有功能的目的。

它的設計原則是:要儘量使用合成/聚合,儘量不要使用繼承。

五、常用設計模式

單例、工廠、觀察者、建造者下面簡單的粗略的講幾種常用的設計模式、並舉例說明。

需深入的我會附上鍊接供大家詳細瞭解。

(1)單例模式

https://mp.csdn.net/postedit/83864571

(2)工廠模式

https://mp.csdn.net/postedit/83999073

(3)觀察者模式

https://mp.csdn.net/postedit/84189465

(4)建造者模式

https://mp.csdn.net/postedit/84261641

先介紹這些常見模式,以後學習完再繼續總結,後續將繼續新增。

不過短期內可能不會有新的更新,主要原因是最近身體有點不適,你們懂得。

六、原始碼地址

https://github.com/DayorNight/DesignPattern

七、參考文件

https://baike.baidu.com/item/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1212549?fr=aladdin
http://www.runoob.com/design-pattern/design-pattern-intro.html

八、內容推薦

簡書:https://www.jianshu.com/p/c4c550b8d849

如果你覺得我寫的不錯或者對您有所幫助的話。不妨頂一個【微笑】,別忘了點贊、收藏、加關注哈!!

您的每個舉動都是對我莫大的支援