設計模式分爲三大類:
創建型模式 (5種):
- 工廠方法模式 (Factory Pattern)
- 抽象工廠模式 (Abstract Factory Pattern)
- 單例模式 (Singleton Pattern)
- 建造者模式 (Builder Pattern)
- 原型模式(Prototype Pattern)
結構型模式 (7種):
- 適配器模式 (Adapter Pattern)
- 裝飾者模式(Decorator Pattern)
- 代理模式(Proxy Pattern)
- 外觀模式(門面模式Facade Pattern)
- 橋接模式 (Bridge)
- 組合模式(Composite Pattern)
- 享元模式(Flyweight Pattern)
行爲型模式(11種):
- 策略模式 (Strategy Pattern)
- 模板方法模式(Template Pattern)
- 觀察者模式(Observer Pattern)
- 迭代子模式(Iterator Pattern)
- 責任鏈模式 (Chain of Responsibility Pattern)
- 命令模式(Command Pattern)
- 備忘錄模式(Memento Pattern)
- 狀態模式(State Pattern)
- 訪問者模式(Visitor Pattern)
- 中介者模式(Mediator Pattern)
- 解釋器模式(Interpreter Pattern)
額外兩類:
併發型模式和線程池模式。
設計模式的七大原則:
- 單一職責原則SRP(Single Responsibility Principle)
就一個類而言,應該僅有一個引起它變化的原因。 - 開放-關閉原則OCP(Open-CLosed Principle)
一個軟件的實體應該對擴展開放,對修改關閉。 - 里氏代換原則(Liskov Substitution Principle)
子類型必須能夠替換他們的基類(父類)。 - 依賴倒置原則DIP(Dependence Inversion Principle)
要依賴於抽象,不要依賴於具體。 - 最少知識原則LKP(Least Knowledge Principle)或稱 迪米特法則(LoD)
一個類對於其他類知道的越少越好,就是說一個對象應當對其他對象有儘可能少的瞭解,只和朋友通信,不和陌生人說話 - 接口隔離原則(ISP)
使用多個專門的接口比使用單一的功能更多的總接口要好 - 合成/聚合原則
要儘量使用合成/聚合,而不是繼承關係達到複用的目的
1.單一職責原則SRP(Single Responsibility Principle)
所謂單一職責原則就是一個類僅有一個引起它變化的原因。這裏變化的原因就是所說的“職責”。如果一個類有多個引起它變化的原因,那麼也就意味着這個類有多個職責,再進一步說,就是把多個職責耦合在一起了。
2.開放-關閉原則OCP(Open-CLosed Principle)
所謂開放-閉合原則,指的是,一個類應該對擴展開放,最修改關閉。一般也被簡稱開閉原則,開閉原則是設計中非常核心的一個原則。
開閉原則要求的是,類的行爲是可以擴展的,而且是在不修改已有代碼的情況下進行擴展,也不必改動已有的源代碼或者二進制代碼。
實現開閉原則的關鍵就在於合理地抽象、分離出變化和不變化的部分,爲變化的部分留下可擴展的方式,比如,鉤子方法或者是動態組合對象等。
這個原則看起來也很簡單。但事實上,一個系統要全部做到遵守開閉原則,幾乎是不可能的,也沒這個必要。適度的抽象可以提高系統的靈活性,使其可擴展、可維護,但是過度的抽象,會大大的增加系統的複雜程度。應該在需要改變的地方應用開閉原則就可以了,而不用到處使用,從而陷入過度設計。
3.里氏代換原則(Liskov Substitution Principle)
子類型(subtype)必須能夠替換它們的基(父)類型。(子類可以以父類的身份出現)。
比如,如果是父類是鳥,鳥會飛。企鵝🐧不會飛,企鵝是鳥嗎?所以企鵝不能繼承鳥這個類。
4.依賴倒置原則DIP(Dependence Inversion Principle)
所謂依賴倒置原則,指的是,要依賴於抽象,不要依賴於具體類。要做到依賴倒置,典型的應用應該做到:
- 高層模塊不應該依賴於底層模塊,二者都應該依賴於抽象
- 抽象不應該依賴於具體實現,具體實現應該依賴於抽象
- 一般高層模塊包含對業務功能的處理和業務策略選擇,應該被重用的,是高層模塊去影響底層的具體實現。
- 要針對接口編程,而不是針對實現編程
因此,這個底層的接口與應該由高層提出的,然後由底層實現的,也就是說底層接口的所有權在高層模塊,因此是一種所有權的倒置。
啓示:好的程序應該強內聚,鬆耦合。
5.最少知識原則LKP(Least Knowledge Principle)或稱 迪米特法則(LoD)
這個原則用來指導我們在設計系統的時候,應該儘量減少對象之間的交互,對象只和自己的朋友談話,也就是隻和自己的朋友交互,從而鬆散類之間的耦合。通過鬆散類之間的耦合來降低類之間的相互依賴,這樣在修改系統的某一個部分的時候,就不會影響其他的部分,從而使得系統具有更好的維護性。
那麼哪些對象才能當做朋友呢?
- 當前對象本身
- 通過方法的參數傳遞過來的對象
- 當前對象所創建的對象
- 當前對象的實例變量所引用的對象
- 方法內所創建或者實例化的對象
其根本思想:
- 強調了類之間的鬆耦合。
- 類之間的耦合越弱,越有利於複用,一個處於弱耦合的類被修改,不會對有關係的類造成波及。
- 信息的隱藏促進了軟件的複用。
6.接口隔離原則(ISP)
接口隔離原則(Interface Segregation Principle)講的是:使用多個專門的接口比使用單一的總接口要好。換而言之,從一個客戶類的角度來講:一個類對另外一個類的依賴性應當是建立在最小接口上的。
過於臃腫的接口是對接口的污染。不提倡使用,也不應該是用Dirt Interface。
7.合成/聚合原則
要儘量使用合成/聚合,而不是繼承關係達到複用的目的。
合成/聚合原則就是在一個新的對象裏面使用一些已有的對象,使之成爲新對象的一部分;新的對象通過向這些對象的委派達到複用已有。