整體來講設計模式分爲三大類:
建立型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。
結構型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。
行爲型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。
其實還有兩類:併發型模式和線程池模式。編程
設計模式的本質是面向對象方法的實際運用。具體而言,是封裝、繼承、多態和關聯的反覆使用。能夠說,如今市面上關於設計模式的書沒有一本是適合初學者的。設計模式
感受真正理解什麼是設計模式,就是要透徹理解OO的四大要素:封裝、繼承、多態和關聯。其中核心是封裝的概念。 併發
設計模式之六大原則
開閉原則(Open Close Principle)
1988年,勃蘭特·梅耶(Bertrand Meyer)在他的著做《面向對象軟件構造(Object Oriented Software Construction)》中提出了開閉原則,它的原文是這樣:「Software entities should be open for extension,but closed for modification」。線程
- 意思:軟件模塊應該對擴展開放,對修改關閉。
- 舉例:在程序須要進行新增功能的時候,不能去修改原有的代碼,而是新增代碼,實現一個熱插拔的效果(熱插拔:靈活的去除或添加功能,不影響到原有的功能)。
- 目的:爲了使程序的擴展性好,易於維護和升級。
- 意思:里氏代換原則是繼承複用的基石,只有當衍生類能夠替換掉基類,軟件單位的功能不受到影響時,基類才能真正被複用,而衍生類也可以在基類的基礎上增長新的行爲。
- 舉例:球類,本來是一種體育用品,它的衍生類有籃球、足球、排球、羽毛球等等,若是衍生類替換了基類的本來方法,如把體育用品改爲了食用品(那麼軟件單位的功能受到影響),就不符合里氏代換原則。
- 目的:對實現抽象化的具體步驟的規範。
- 意思:針對接口編程,而不是針對實現編程。
- 舉例:以計算機系統爲例,不管主板、CPU、內存、硬件都是在針對接口設計的,若是針對實現來設計,內存就要對應到針對某個品牌的主板,那麼會出現換內存須要把主板也換掉的尷尬。
- 目的:下降模塊間的耦合。
- 使用多個隔離的接口,比使用單個接口要好。
- 舉例:好比:登陸,註冊時屬於用戶模塊的兩個接口,比寫成一個接口好。
- 目的:提升程序設計靈活性。
里氏代換原則(Liskov Substitution Principle)
依賴倒轉原則(Dependence Inversion Principle)
接口隔離原則(Interface Segregation Principle)
迪米特法則(最少知道原則)(Demeter Principle)
1987年秋天由美國Northeastern University的Ian Holland提出,被UML的創始者之一[Booch]等普及。後來,由於在經典著做《 The Pragmatic Programmer》而廣爲人知。設計
- 意思:一個實體應當儘可能少的與其餘實體之間發生相互做用,使得系統功能模塊相對獨立。
- 舉例:一個類公開的public屬性或方法越多,修改時涉及的面也就越大,變動引發的風險擴散也就越大。
- 目的:下降類之間的耦合,減小對其餘類的依賴。
單一職責原則( Single responsibility principle )
該原則由羅伯特·C·馬丁(Robert C. Martin)於《敏捷軟件開發:原則、模式和實踐》一書中給出的。馬丁表示此原則是基於湯姆·狄馬克(Tom DeMarco)和Meilir Page-Jones的著做中的內聚性原則發展出的。代理
- 意思:一個類只負責一個功能領域中的相應職責,或者能夠定義爲:就一個類而言,應該只有一個引發它變化的緣由。
- 舉例:該原則意思簡單到不須要舉例!
- 目的:類的複雜性下降,可讀性提升,可維護性提升。