設(shè)計模式之設(shè)計原則

設(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è)計模式

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容