<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          送你一份設(shè)計模式入坑指南!寫出詩一樣的代碼

          共 2085字,需瀏覽 5分鐘

           ·

          2021-02-10 16:09


          寫在前面

          今天開通了「設(shè)計模式」系列,和大家一起學(xué)習(xí)設(shè)計模式,加深我自己記憶的同時,也希望能給大家?guī)硪恍椭?,畢竟只有我的文章大家都能看懂,才證明我真正學(xué)廢(會)了。

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

          設(shè)計模式(Design Pattern):是前輩們對代碼開發(fā)經(jīng)驗的總結(jié),是解決特定問題的一系列套路。注意,它并不是語法規(guī)定,而是一套用來提高代碼可復(fù)用性、可維護(hù)性、可讀性、穩(wěn)健性以及安全性的解決方案。

          1995年,GoF(Gang of Four,四人組/四人幫)合作出版了《設(shè)計模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》一書,共收錄了 23 種設(shè)計模式,從此樹立了軟件設(shè)計模式領(lǐng)域的里程碑,人稱『GoF設(shè)計模式』。

          為什么要學(xué)設(shè)計模式?

          當(dāng)我們回頭看半年前或者一年前自己寫的代碼時,我們會發(fā)現(xiàn):這誰寫的代碼?寫得這么爛?啪啪打臉。

          我覺得主要原因有兩個:

          其一,剛接觸代碼不久,對于剛剛學(xué)習(xí)編程的小伙伴來說,編碼還不熟練,要寫出雷軍那樣“像詩一樣優(yōu)雅”的代碼,顯然不太現(xiàn)實,哈哈。

          其二,是因為我們沒有學(xué)習(xí)設(shè)計模式,設(shè)計模式是軟件設(shè)計中常見問題的典型解決方案,如果不懂的話,那編碼過程中就比較難受了。

          設(shè)計模式是前人軟件設(shè)計智慧的結(jié)晶,學(xué)習(xí)設(shè)計模式重在理解它的思想,設(shè)計模式的本質(zhì)是面向?qū)ο笤O(shè)計原則的實際運用,是對類的封裝性、繼承性和多態(tài)性以及類的關(guān)聯(lián)關(guān)系和組合關(guān)系充分理解。

          學(xué)習(xí)設(shè)計模式有這幾個優(yōu)點:

          • 可以提高程序員的思維能力、編程能力和設(shè)計能力。

          • 使程序設(shè)計更加標(biāo)準(zhǔn)化、代碼編制更加工程化,使軟件開發(fā)效率大大提高,從而縮短軟件開發(fā)周期。

          • 讓代碼可復(fù)用性高、可讀性強、可靠性高、靈活性好、可維護(hù)性強。

          一直以來,我們都在使用別人設(shè)計好的框架、工具類、庫等,利用它們的 API 編寫我們的程序,但是普通的工具類是沒有辦法把我們的程序組織成一個代碼復(fù)用性高、可讀性強、靈活性好、具有彈性的結(jié)構(gòu)。也正因為如此,才出現(xiàn)了越來越多的集成式框架,比如說 Spring、Mybatis 等。這些框架很好地幫我們處理好了這些問題,因為它們本身都使用了設(shè)計模式。所以在開發(fā)中,設(shè)計模式是很重要的,非常有必要把它學(xué)懂。

          雷軍說過:我沒有寫過詩,但是有人說我寫過的代碼,像詩一樣優(yōu)雅。

          說白了,設(shè)計模式越熟練,寫出來的代碼就更優(yōu)雅,閱讀起來就很舒服,可維護(hù)性、可擴(kuò)展性就更強。

          設(shè)計模式分類

          不同設(shè)計模式的復(fù)雜程度和應(yīng)用范圍等各方面都不相同,所以可以根據(jù)模式的目的來進(jìn)行分類。主要分為以下三種:

          • 創(chuàng)建型模式:提供創(chuàng)建對象的機(jī)制,用于描述“怎么創(chuàng)建對象”,主要特點是“將對象的創(chuàng)建與使用分離”。

            提供了「單例、原型、工廠方法、抽象工廠、建造者」等 5 種創(chuàng)建型模式。

          • 結(jié)構(gòu)型模式:介紹如何將對象和類組裝成較大的結(jié)構(gòu)。

            提供了「代理、適配器、橋接、裝飾、外觀、享元、組合」等 7 種結(jié)構(gòu)型模式。

          • 行為型模式:負(fù)責(zé)對象間的高效溝通和職責(zé)委派,也就是用于描述類或?qū)ο笾g怎樣相互協(xié)作完成單個對象都無法單獨完成的任務(wù),以及怎樣分配職責(zé)。

            提供了「模板方法、策略、命令、職責(zé)鏈、狀態(tài)、觀察者、中介者、迭代器、訪問者、備忘錄、解釋器」等 11 種行為型模式。

          OOP七大原則

          上文提到了面向?qū)ο笤O(shè)計原則,也說了設(shè)計模式是對設(shè)計原則的應(yīng)用,到底有哪些原則呢,一起來看看。名詞記不住不要緊,盡量用通俗易懂的解釋來幫助理解。

          • 開閉原則:對擴(kuò)展開放,對修改關(guān)閉

            當(dāng)我們的應(yīng)用程序有新需求時,我們盡量不去修改原來的代碼,而是基于這個代碼來進(jìn)行擴(kuò)展。這就是所謂的對擴(kuò)展開放,對修改關(guān)閉。

          • 里氏替換原則:繼承必須確保超類所擁有的性質(zhì)在子類中依然成立

            拿 Java 中的繼承來舉例,我們盡量不要在子類中更改從父類繼承的方法,而是盡量添加新的方法完成新的功能,如果重寫父類方法的話,可復(fù)用性就會變差,在后期各種模式的詳細(xì)講解中也會舉例說明原因。

          • 依賴倒置原則:要面向接口編程,不要面向?qū)崿F(xiàn)編程

            模塊之間不能相互依賴,而是依賴它們的抽象,模塊的細(xì)節(jié)應(yīng)該基于接口來實現(xiàn),使用抽象類可以用來指定約束和規(guī)范。

          • 單一職責(zé)原則:控制類的粒度大小、將對象解耦、提高其內(nèi)聚性

            可以簡單理解為類中的方法只做一件事情,避免多個功能堆在一起,降低耦合。

          • 接口隔離原則:要為各個類建立它們需要的專用接口

            其實就是把接口拆分成更小的接口,和單一職責(zé)原則一樣都是為了將對象解耦,提高內(nèi)聚性。

          • 迪米特原則:只與你的直接朋友交談,不跟“陌生人”說話

            一個對象其他對象知道的越少越好,只和朋友通信,不和陌生人說話。

          • 合成復(fù)用原則:盡量先使用組合或者聚合等關(guān)聯(lián)關(guān)系來實現(xiàn),其次才考慮使用繼承關(guān)系來實現(xiàn)

            組合是“有一個”,繼承為“是一個”,通常“有一個”可能比“是一個”更好。

          覺得這篇文章對你有幫助的話,可以來個點贊 + 在看,下期再見!如果你想要設(shè)計模式的學(xué)習(xí)視頻資料,可以關(guān)注下面公眾號,回復(fù)【設(shè)計模式】獲取!

          瀏覽 22
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲中文日韩无码 | 91人妻澡 | av俺也去在线播放 | 成人A片区 | 国产精品久久久久久久久借妻 |