什么是軟件設計原則?
軟件設計原則是一組幫助我們避開不良設計的指導方針。這些設計原則是由 Robert Martin 在《敏捷軟件開發:原則、模式與實踐》一書中整理收集而來。 根據 Robert Martin 的理論,應該避免不良設計的以下三個重要特點:
- 僵化: 很難做改動,因為每一個細微的改動都會影響到系統大量的其他功能
- 脆弱: 每當你做一次改動,總會引起系統中預期之外的部分出現故障
- 死板: 代碼很難在其他應用中重用,因其不能從當前應用中單獨抽離出來
開放-關閉原則 Open Close Principle
軟件實體,如類、模塊和函數,應該對擴展開放,對修改關閉。
OPC 是一個通用原則。 你可以在這種情景下考慮此原則:當你構建類的時候,你想要確保以后你要擴展類行為時只需擴展它而不需要修改原類。這原則同樣適用于模塊、包和代碼庫。如果你手頭一個包含多個類的代碼庫,大多數情況下你更愿意去擴展它,也不想去修改已有的代碼(向后兼容,回歸測試等)。 這就是為什么我們必須確保我們的模塊遵循開放-關閉原則的原因。
當提及類時,開放-關閉原則可以通過使用抽象類+實現類來實現他們的行為。這會強制使用具體實現類來擴展抽象類而不去修改抽象類。具體的實例有:模版模式、策略模式。
依賴倒置原則 Dependency Inversion Principle
高層次的模塊不應該依賴低層次的模塊。雙方都應該依賴抽象。
抽象不應該依賴具體細節。細節應該依賴抽象。
依賴倒置原則強調:我們應在高低層次的類之間引入一個抽象層來解耦高層次模塊和低層次模塊。此外,此原則顛倒了依賴關系:它認為我們應該基于抽象來編寫具體的實現,而不基于具體實現來編寫抽象。
當談及依賴關系的實現時,我們經常聽到的是依賴倒置 (DI) 或者控制反轉 (IOC) 。一個軟件模塊(類,框架等)依賴其他模塊時,經典的做法是初始化并持有該模塊的直接引用。這種做法導致兩個模塊的強耦合。為了解耦兩者,第一個模塊提供一個鉤子(一個屬性,參數,其他),然后一個專門管理依賴關系的外部模塊將第二個模塊的引用注入到第一個模塊的鉤子上。
通過使用依賴倒置原則,只需要修改依賴管理模塊,被依賴模塊就可以很容易的替換成其他模塊。工廠模式和抽象工廠模式可以作為框架管理依賴,不過,有專門的框架來做這件事,稱之為控制反轉容器(Invertion Of Control Container)。
接口隔離原則Interface Segregation Principle
客戶端不應該被強制依賴他們不需要使用的接口
這個原則教導要我們小心對待我們編寫的接口。編寫接口時,我們必須注意只增加應該在其職責范圍內的方法。如果我們增加了不應該出現在接口功能范圍內的方法,那么實現此接口的類將不得不實現也那些方法。比如說,我們建了個名為 Worker 的接口,然后增加了個 lunch-break 的方法,那么所有的 Workers 都得實現它。如果有個 Worker 是機器人怎么辦?機器人應該不用午休吧。
總而言之,如果一個接口包含了不是針對其意圖的方法,那么這個接口就是被污染了或者叫“肥”接口。 應該避免這些非領域內的方法。
單一職責原則 Single Responsibility Principle
一個類,應該只有一個需要進行修改的原因。
關于這點,職責被認為是一個修改的原因。這個原則強調,如果我們基于2個不同的原因去修改一個類,那么我們應該將其功能拆分到2個類中。每個類僅僅負責一個功能。如果日后我需要做一次修改,我們只需修改負責該功能的類就可以了。當我們在同時負責多個功能的類上做一個修改時,可能會影響到其他的功能。
單一職責原則是Tom DeMarco于1979年在他的書《Structure Analysis and System Specification》中提出的。Robert Martin重新解釋并將職責(功能)定義為變化的原因。
里氏替換原則 Liskov's Substitution Principle
派生類型必須能被其基類完全代替
此原則是在開放-關閉原則在行為方面的延伸,其意味著我們必須確新的派生類擴展基類的同時不能修改其行為。新創建的派生類應該能夠替換基類而不用修改任何代碼。
里氏替換原則是 Barbara Liskov 于1987年在 “面向對象編程語言系統和應用程序” 大會上提出的, 具體可看 data abstraction and hiearchy。
如何應用設計原則 摘自《面向對象葵花寶典》
OCP 原則: 總的指導思想
OCP 原則是一個總的指導思想,在面向對象的設計中,如果能夠符合 LSP/ISP/DIP 原則,一般情況下就能夠符合 OCP 原則了。
除了在面向對象的軟件設計中應用外,OCP 也可以用于指導系統架構設計,例如常見的 CORBA、COM 協議,其實可都可以認為是 OCP 原則的具體應用和實現。
SRP 原則: 用于類的設計
當我們想出一個類,或者設計出一個類的原型后,使用 SRP 原則核對類的設計是否符合 SRP 要求。
LSP 原則: 用于指導類繼承的設計
當我們設計類之間的繼承關系時,使用 LSP 原則來判斷這種繼承關系是否符合 LSP 要求。
ISP 原則: 用于指導接口的設計
ISP 原則可以認為是 SRP 原則的一個變種,本質上是和 SRP 的思想是一樣的。 SRP 用于指導類的設計,而 ISP 用于指導接口的設計
DIP 原則: 用于指導如何抽象
當我們設計類之間的依賴關系時,可以使用 DIP 原則來判斷這種依賴是否符合 DIP 原則二。 DIP 原則 和 LSP 原則相輔相成: DIP 原則用于指導抽象出接口或者抽象類,而 LSP 原則用于指導從接口或者抽象類派生出新的子類。
目錄: http://www.lxweimin.com/p/af861220a6cc
jdk中的設計模式: http://www.lxweimin.com/p/734c62d1fb3d