定義:就一個類而言,應該僅有一個引發它變化的緣由;編程
若是一個類承擔的職責過多,就等於把這些職責耦合在一塊兒,一個職責變化可能會消弱或者抑制這個類完成其餘職責的能力。這種耦合會致使脆弱的設計,當變化發生時,設計會遭受到意想不到的破壞;設計模式
T負責兩個不一樣的職責:職責P1,職責P2。當因爲職責P1需求發生改變而須要修改類T時,有可能會致使本來運行正常的職責P2功能發生故障。也就是說職責P1和P2被耦合在了一塊兒。函數
單一職責比較容易理解,可是在實際設計過程當中容易發生職責擴散:由於某種緣由,某一職責被分化爲顆粒度更細的多個職責了。學習
解決辦法:遵照單一職責原則,將不一樣的職責封裝到不一樣的類或模塊中。優化
定義:子類型必須可以替換掉它們的父類型;ui
一個軟件實體若是使用的是一個父類的話,那麼必定適用於其子類,並且它察覺不出父類對象和子類對象的區別。也就是說,在軟件裏面,把父類都替換成它的子類,程序的行爲沒有變化;spa
只有子類能夠替換父類,軟件單位功能不受到影響時,父類才能真正被複用,而子類也可以在父類的基礎上增長新的行爲;里氏代換原則是對「開-閉」原則的補充。實現「開-閉」原則的關鍵步驟就是抽象化。而基類與子類的繼承關係就是抽象化的具體實現,因此里氏代換原則是對實現抽象化的具體步驟的規範。設計
在進行設計的時候,咱們儘可能從抽象類繼承,而不是從具體類繼承。若是從繼承等級樹來看,全部葉子節點應當是具體類,而全部的樹枝節點應當是抽象類或者接口。代理
定義:server
A.高層模塊不該該依賴低層模塊。兩個都應該依賴抽象;
B.抽象不該該依賴細節,細節應該依賴抽象;(針對接口編程,而不是針對實現;)
面向過程的開發,上層調用下層,上層依賴於下層,當下層劇烈變更時上層也要跟着變更,這就會致使模塊的複用性下降並且大大提升了開發的成本。依賴倒轉很好的解決了這個問題;
定義:儘可能使用合成/聚合,儘可能不要使用類繼承;
優先使用對象的合成/聚合將有助於你保持每一個類被封裝,並被集中在單個任務上。這樣類和類繼承層次會保持較小規模,而且不太可能增加爲不可控制的龐然大物;
爲何儘可能不要使用類繼承而使用合成/聚合?
對象的繼承關係在編譯時就定義好了,因此沒法在運行時改變從父類繼承的子類的實現。
子類的實現和它的父類有很是緊密的依賴關係,以致於父類實現中的任何變化必然會致使子類發生變化。
當你複用子類的時候,若是繼承下來的實現不適合解決新的問題,則父類必須重寫或者被其它更適合的類所替換。
這種依賴關係限制了靈活性,並最終限制了複用性。
定義:若是兩個類沒必要彼此直接通訊,那麼這兩個類就不該當發生直接的相互做用,若是其中一個類須要調用另外一個類的某一個方法的話,能夠經過第三者轉發這個調用;
迪米特根本思想是:類之間的鬆耦合;
類之間的耦合越弱,越有利於複用,一個處於弱耦合的類被修改,不會對有關係的類形成波及。信息的隱藏促進了軟件的複用;
廣義的迪米特法則在類的設計上的體現:
優先考慮將一個類設置成不變類。
儘可能下降一個類的訪問權限。
謹慎使用Serializable。
儘可能下降成員的訪問權限。
定義:軟件實體(類,模塊,函數等等)應該能夠擴展,可是不能夠修改;
對擴展開放,意味着有新的需求或變化時,能夠對現有代碼進行擴展,以適應新的狀況。
對修改封閉,意味着類一旦設計完成,就能夠獨立完成其工做,而不要對類進行任何修改。
這樣的設計,可以面對需求改變卻能夠保持相對穩定,從而使系統在第一個版本之後不斷推出新的版本;面對需求,對程序的改動是經過增長新的代碼進行的,而不是更改現有的代碼;
開放封閉原則,是最爲重要的設計原則,Liskov替換原則和合成/聚合複用原則爲開放封閉原則的實現提供保證。
設計模式分爲那幾類,它們是怎麼區分的,每一種模式類型的特色,包含具體模式呢?
設計模式按照目的來分,能夠分爲建立型模式、結構型模式和行爲型模式。
建立型模式用來處理對象的建立過程,主要包含如下5種設計模式:
工廠方法模式(Factory Method Pattern)
抽象工廠模式(Abstract Factory Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern)
單例模式(Singleton Pattern)
結構型模式用來處理類或者對象的組合,主要包含如下7種設計模式:
適配器模式(Adapter Pattern)
橋接模式(Bridge Pattern)
組合模式(Composite Pattern)
裝飾者模式(Decorator Pattern)
外觀模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)
行爲型模式用來對類或對象怎樣交互和怎樣分配職責進行描述,主要包含如下11種設計模式:
責任鏈模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解釋器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
備忘錄模式(Memento Pattern)
觀察者模式(Observer Pattern)
狀態模式(State Pattern)
策略模式(Strategy Pattern)
模板方法模式(Template Method Pattern)
訪問者模式(Visitor Pattern)