設(shè)計模式之設(shè)計原則
在產(chǎn)品的開發(fā)迭代中,需求修改是經(jīng)常遇到的,一旦需求改變了,那么程序代碼也需要跟著做出相應(yīng)的調(diào)整,在程序開發(fā)中前人總結(jié)出了幾個設(shè)計原則來應(yīng)對這種變化,基于這幾種原則來進行程序設(shè)計能夠更加快速、安全去應(yīng)對各種變化。
設(shè)計原則目的
- 將變化和不變分離,盡量降低變化的可能,縮小變化的影響范圍,使模塊、類、方法盡量原子化
- 擴展的時候,盡量新增類,而不是修改原有的類
一、單一職責原則 Single Responsibility Principle
永遠不要讓一個類存在多個改變的理由。盡量降低變化的可能
二、開閉原則 Open Closed Principle
軟件實體應(yīng)當對擴展開放,對修改關(guān)閉,盡量保證原有邏輯的正確性,降低影響范圍
- 抽離邏輯骨架,定義為接口,接口是穩(wěn)定的,具體的細節(jié)可以通過添加實現(xiàn)類來擴展。
- 直接提供一套新的接口及實現(xiàn)
三、里氏替換原則 Liskov Substitution Principle
任何時候都可以用子類型替換掉父類型。 里氏替換原則通俗的來講就是:子類可以擴展父類的功能,但不能改變父類原有的功能。最終目的就是為了實現(xiàn)開閉原則。
- 子類可以實現(xiàn)父類的抽象方法,但不能覆蓋父類的非抽象方法。
- 子類中可以增加自己特有的方法。
- 當子類的方法重載父類的方法時,子類方法的參數(shù)要是父類方法參數(shù)的父類。
- 當子類的方法實現(xiàn)父類的抽象方法時,方法的返回值要是父類的返回值的子類。
- 如果非要重寫父類的方法,比較通用的做法是:原來的父類和子類都繼承一個更通俗的基類,原有的繼承關(guān)系去掉,采用依賴、聚合,組合等關(guān)系代替。
四、迪米特法則(最少知識原則) Law of Demeter
降低相互依賴,一個對象應(yīng)當對其他對象有盡可能少的依賴,降低依賴對象改變引起其他的對象的改動
- 門面模式和中介者模式
- 在寫類的時候,能不
public就不public,所有暴露的屬性或是接口,都是不得不暴露的,保證其他類對這個類有最少的了解了 - 單一職責原則和接口隔離原則
五、接口隔離原則 Interface Segregation Principle
盡量保證接口中只有用戶關(guān)心的方法,避免用戶去實現(xiàn)不關(guān)心的接口。將接口的粒度控制到最小,這樣以后修改的可能就會更小
- 如果一個類實現(xiàn)一個接口,但這個接口中有它不需要的方法,那么就需要把這個接口拆分,把它需要的方法提取出來,組成一個新的接口讓這個類去實現(xiàn),這就是接口隔離原則
- 提高內(nèi)聚,減少對外交互,如果用戶實現(xiàn)了不關(guān)心的接口方法,如果方法發(fā)生變化,導(dǎo)致用戶也需跟著改動
- 接口盡量小,但是要有限度。對接口進行細化可以提高程序設(shè)計靈活性是不爭的事實,但是如果過小,則會造成接口數(shù)量過多,使設(shè)計復(fù)雜化。所以一定要適度。
- 看起來,該原則與單一職責原則很相像。確實很像,二者都是強調(diào)要將接口進行細分,只不過分的方式不同。單一職責原則是按照
職責進行劃分接口的;而接口隔離原則則是按照實現(xiàn)類對方法的使用來劃分的??梢哉f,接口隔離原則更細一些。
六、依賴倒轉(zhuǎn)原則 Dependence Inversion Principle
抽象不應(yīng)該依賴細節(jié),細節(jié)應(yīng)該依賴抽象,面向接口編程。依賴不變的,不要依賴變動的
依賴抽象,當需要改變細節(jié)時,只需要再添加一種新的實現(xiàn)類,然后將依賴修改為新的實現(xiàn)類對象
在開發(fā)中,經(jīng)常會定義很多接口,然后寫一種實現(xiàn),雖然很多時候只有一種實現(xiàn),但是誰能保證會不會再多出一種實現(xiàn),一旦需要修改細節(jié)實現(xiàn),只需要添加一種實現(xiàn)類,如 Dao層,可以提供多種數(shù)據(jù)來源的具體實現(xiàn),Service層只需要依賴Dao提供的接口,接口時不會變的。
設(shè)計模式
為了更好的是遵循和實現(xiàn)設(shè)計原則,前人總結(jié)了一些設(shè)計模式
