程序員經(jīng)常說的「設(shè)計模式」到底是什么?

6 評論 10268 瀏覽 21 收藏 8 分鐘

當程序員說去「設(shè)計模式」時,你是否會一臉懵逼,到底什么是設(shè)計模式呢?

很多人應(yīng)該聽說過設(shè)計模式(Design pattern),又或多或少的看過或用過設(shè)計模式,但是實際用在開發(fā)過程中總有點心有余而力不足的感覺。那肯定是對設(shè)計模式的理解有少許偏差或者不夠深入。先不談某種具體的模式,先來看看什么是設(shè)計模式?

什么是設(shè)計模式?

設(shè)計模式是一套代碼設(shè)計「經(jīng)驗的總結(jié)」。項目中「合理的」運用設(shè)計模式可以「巧妙的解決很多問題」。

經(jīng)驗的總結(jié):抱著「代碼虐我千百遍,我待代碼如初戀」的心態(tài),最終得出來的「套路」。

合理的:要對設(shè)計模式的使用場景有一定的認識后才使用,「不要濫用」。如:輸出一句“hello world”,非要強行給加上各種模式。

問:“為什么”,答:“總感覺少了模式!”。

巧妙的解決了很多問題:被廣泛應(yīng)用的原因。

為什么要提倡“Design Pattern呢?根本原因是為了代碼復(fù)用,增加可維護性。那么怎么才能實現(xiàn)代碼復(fù)用呢?

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

開閉原則(Open Close Principle)

1988年,勃蘭特·梅耶(Bertrand Meyer)在他的著作《面向?qū)ο筌浖?gòu)造(Object Oriented Software Construction)》中提出了開閉原則,它的原文是這樣:“Software entities should be open for extension,but closed for modification”。

  • 意思:軟件模塊應(yīng)該對擴展開放,對修改關(guān)閉。
  • 舉例:在程序需要進行新增功能的時候,不能去修改原有的代碼,而是新增代碼,實現(xiàn)一個熱插拔的效果(熱插拔:靈活的去除或添加功能,不影響到原有的功能)。
  • 目的:為了使程序的擴展性好,易于維護和升級。

里氏代換原則(Liskov Substitution Principle)

  • 意思:里氏代換原則是繼承復(fù)用的基石,只有當衍生類可以替換掉基類,軟件單位的功能不受到影響時,基類才能真正被復(fù)用,而衍生類也能夠在基類的基礎(chǔ)上增加新的行為。
  • 舉例:球類,原本是一種體育用品,它的衍生類有籃球、足球、排球、羽毛球等等,如果衍生類替換了基類的原本方法,如把體育用品改成了食用品(那么軟件單位的功能受到影響),就不符合里氏代換原則。
  • 目的:對實現(xiàn)抽象化的具體步驟的規(guī)范。

依賴倒轉(zhuǎn)原則(Dependence Inversion Principle)

  • 意思:針對接口編程,而不是針對實現(xiàn)編程。
  • 舉例:以計算機系統(tǒng)為例,無論主板、CPU、內(nèi)存、硬件都是在針對接口設(shè)計的,如果針對實現(xiàn)來設(shè)計,內(nèi)存就要對應(yīng)到針對某個品牌的主板,那么會出現(xiàn)換內(nèi)存需要把主板也換掉的尷尬。
  • 目的:降低模塊間的耦合。

接口隔離原則(Interface Segregation Principle)

  • 使用多個隔離的接口,比使用單個接口要好。
  • 舉例:比如:登錄,注冊時屬于用戶模塊的兩個接口,比寫成一個接口好。
  • 目的:提高程序設(shè)計靈活性。

迪米特法則(最少知道原則)(Demeter Principle)

1987年秋天由美國Northeastern University的Ian Holland提出,被UML的創(chuàng)始者之一[Booch]等普及。后來,因為在經(jīng)典著作《 The Pragmatic Programmer》而廣為人知。

  • 意思:一個實體應(yīng)當盡量少的與其他實體之間發(fā)生相互作用,使得系統(tǒng)功能模塊相對獨立。
  • 舉例:一個類公開的public屬性或方法越多,修改時涉及的面也就越大,變更引起的風(fēng)險擴散也就越大。
  • 目的:降低類之間的耦合,減少對其他類的依賴。

單一職責原則( Single responsibility principle )

該原則由羅伯特·C·馬?。≧obert C. Martin)于《敏捷軟件開發(fā):原則、模式和實踐》一書中給出的。馬丁表示此原則是基于湯姆·狄馬克(Tom DeMarco)和Meilir Page-Jones的著作中的內(nèi)聚性原則發(fā)展出的。

  • 意思:一個類只負責一個功能領(lǐng)域中的相應(yīng)職責,或者可以定義為:就一個類而言,應(yīng)該只有一個引起它變化的原因。
  • 舉例:該原則意思簡單到不需要舉例!
  • 目的:類的復(fù)雜性降低,可讀性提高,可維護性提高。

剛?cè)胄械臅r候,在想什么樣的代碼是好代碼?看到很多前輩的文字都說好的代碼要符合「高內(nèi)聚,低耦合」,但是我聽到這樣的解釋,是這樣的

而現(xiàn)在對設(shè)計模式有了一定程度上的學(xué)習(xí),感覺懂了一些,小伙伴們你們學(xué)會了嗎?

高內(nèi)聚,低耦合?

  • 內(nèi)聚是從功能角度來度量模塊內(nèi)的聯(lián)系,一個好的內(nèi)聚模塊應(yīng)當恰好做一件事。它描述的是模塊內(nèi)的功能聯(lián)系;
  • 耦合是軟件結(jié)構(gòu)中各模塊之間相互連接的一種度量,耦合強弱取決于模塊間接口的復(fù)雜程度、進入或訪問一個模塊的點以及通過接口的數(shù)據(jù)。

 

作者:碼個蛋(微信號公眾號:碼個蛋),創(chuàng)業(yè)公司技術(shù)主管,喜歡分享,樂于開源。擅長Android開發(fā),對前端、后臺技術(shù)略懂,目前主要負責團隊管理。

本文由 @碼個蛋 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載。

題圖來自PEXELS,基于CC0協(xié)議

更多精彩內(nèi)容,請關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號或下載App
評論
評論請登錄
  1. 非技術(shù)出身產(chǎn)品經(jīng)理的技術(shù)溝通秘籍!15天補齊程序/代碼、前端、后端、數(shù)據(jù)庫4大模塊基礎(chǔ)技術(shù)知識。
    詳情戳>http://996.pm/7daXE 或咨詢起點學(xué)院蘑菇(wx:qdxymg)

    來自廣東 回復(fù)
  2. 我倒覺得你這篇文章講得是“開發(fā)模式”,剛好你確實是一名開發(fā)者 ??

    來自廣東 回復(fù)
    1. ?? 開發(fā)中的設(shè)計模式

      來自上海 回復(fù)
  3. 下篇文章能不能詳細的解說一下幾種常用的設(shè)計模式啊,比如觀察者模式、工廠模式、代理模式

    來自上海 回復(fù)
    1. 完全沒問題

      來自上海 回復(fù)
    2. 第二篇文章看來遙遙無期啊。。

      回復(fù)