<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è)計模式那么多!面試官會怎么問?

          共 3002字,需瀏覽 7分鐘

           ·

          2021-10-13 08:52

          大家好,我是躍哥。躍哥一開始經(jīng)營公眾號的時候,就寫過一系列的設(shè)計模式文章,到現(xiàn)在也過去不少時間了。今天再來和大家強調(diào)一下,在這么多設(shè)計模式中,面試官會怎么問呢?


          不過今天用了小伙伴Jungle的文章,他用的是C++的語言,但是設(shè)計模式不在乎語言對吧,所以繼續(xù)深入吧。



          Jungle花了幾個月的時間整理出了《C++設(shè)計模式系列》,將源碼放到了Github上,并且自從這一系列博客發(fā)布至今,陸續(xù)在修復(fù)bug、完善代碼和說明文檔。當然,文章還存在很多不足,Jungle也將持續(xù)完善。(C++設(shè)計模式系列文章
          源碼地址:
          https://github.com/FengJungle/DesignPattern
          但23種設(shè)計模式,要全部記住怎么可能呢?若是應(yīng)對面試,哪些設(shè)計模式是考察的重災(zāi)區(qū)呢?本文Jungle將結(jié)合個人校招和社招面試經(jīng)驗,總結(jié)在面試過程中經(jīng)常考察的設(shè)計模式。



          開放式問題



          一些面試官會考察關(guān)于設(shè)計模式的開放式的問題,比如:

          了解設(shè)計模式嗎?說說你對設(shè)計模式的理解/認識?你知道哪些設(shè)計模式?

          這類問題比較輕松愉快,但凡了解過設(shè)計模式都能回答上來。比如可以從設(shè)計模式分為創(chuàng)建型、結(jié)構(gòu)型、行為型三類說起,每一類包含的具體的設(shè)計模式,再詳細點,可以談?wù)劽恳活愒O(shè)計模式的特點。每一類不必說全,像結(jié)構(gòu)型、行為型總共包含18種設(shè)計模式,全部說完會花很長的時間,所以挑重點或者你熟悉的來說。

          盡管這個問題很開放,但也要注意回答的重點。因為這個問題后,面試官往往會根據(jù)你回答的設(shè)計模式提出進一步的問題,所以面試時要注意為后面的回答做好鋪墊


          設(shè)計模式的優(yōu)點/好處?

          參見下面這篇,第二章,設(shè)計模式的作用。

          https://blog.csdn.net/sinat_21107433/article/details/102513485



          你用過哪些設(shè)計模式?

          這個問題說難也難,如果不了解設(shè)計模式,你可能說不上來,即使你在coding過程中已經(jīng)用上某些設(shè)計模式了(比如工廠模式、原型模式、組合模式等),但不自知。沒辦法,得提早準備了解設(shè)計模式才行,否則錯過一道送分題!



          經(jīng)常考察的設(shè)計模式



          單例模式

          毫無疑問,單例模式以其簡潔的概念、密集的使用頻次和重要的使用場景、加上簡潔的編碼實現(xiàn),成為了眾多設(shè)計模式中考察頻次最多的一個。除了其簡潔的概念以外,輔之以具體的應(yīng)用場景(比如操作系統(tǒng)全局唯一的任務(wù)管理器等)則更有說服力。白板編程實現(xiàn)單例模式幾乎成了必考點。面試時尤其要注意:

          • 懶漢模式和惡漢模式的實現(xiàn)(判空!!!加鎖!!!),并且要能說明原因(為什么判空兩次?)

          • 構(gòu)造函數(shù)的設(shè)計(為什么私有?除了私有還可以怎么實現(xiàn)(進階)?)

          • 對外接口的設(shè)計(為什么這么設(shè)計?)

          • 單例對象的設(shè)計(為什么是static?如何初始化?如何銷毀?(進階))

          • 對于C++編碼者,需尤其注意C++11以后的單例模式的實現(xiàn)(為什么這么簡化?怎么保證的(進階))



          工廠模式、簡單工廠模式、抽象工廠模式

          工廠模式系列(工廠方法模式、工廠模式、簡單工廠模式、抽象工廠模式)在實際項目開發(fā)過程中經(jīng)常使用。比如Jungle最近在分析的NVDLA的源碼,其中就大量使用到了工廠模式,其優(yōu)點顯而易見:增加需求的時候擴展方便!

          當然,原始的工廠模式存在一定的不足,所以進而衍生出了簡單工廠、抽象工廠模式等。每種工廠模式的特點需要了解下,不必死記硬背,記住Jungle文章中的實例就ok了。Anyway,工廠模式系列,不論是在面試中還是在實際項目開發(fā)中,頻率都很高。



          觀察者模式(發(fā)布訂閱模式、模型-視圖模式、源-監(jiān)聽器模式、從屬者模式)

          從這個模式有這么多變種的名稱就知道它使用有多么廣泛!

          觀察者模式建立了一種一對多的聯(lián)動,一個對象改變時將自動通知其他對象,其他對象將作出反應(yīng)。這個概念實在是太強大了,粗略思考下:一個系統(tǒng)內(nèi)有許多存在耦合關(guān)系的對象,對象之間存在某種聯(lián)動關(guān)系。這是不是很常見?消息更新、廣播機制、消息傳遞、鏈式觸發(fā)(高級啊)……凡是涉及到這些概念,是不是都會考慮到觀察者模式?

          問題1:哪些場景可以使用此設(shè)計模式?(上述紅字部分的場景)

          問題2:觀察者模式有什么特點?看下文即可:

          https://blog.csdn.net/sinat_21107433/article/details/102927937



          職責(zé)鏈模式(責(zé)任鏈模式)

          項目中責(zé)任鏈模式也比較常用,從其概念可以看出其適合的應(yīng)用場景:鏈!

          避免將一個請求的發(fā)送者和接收者耦合在一起,讓多個對象都有機會處理請求。將接收請求的對象連接成一條鏈,并且沿著這條鏈傳遞請求,直到有一個對象能夠處理它為止。?

          解耦,不僅是該模式的作用和特點,更是軟件設(shè)計的原則之一。如何來判定某個對象是否有機會處理鏈上的請求,這個判斷的過程是不是像極了過濾器?所以過濾器的設(shè)計可以說是該模式的一個特點。

          此外,采用職責(zé)鏈模式不僅可以方便擴展(當增加一個接受者時,只需要在鏈上的適當位置插入對應(yīng)的處理方法即可),而且可以替換掉代碼中可能存在的switch-case或者if-else,從代碼簡潔的考量也是一個不錯的回答角度。(當然,替換掉switch-case或if-else不僅僅只有這種設(shè)計模式可以達到)。



          適配器模式

          開發(fā)中會經(jīng)常使用到適配器模式,比如,不經(jīng)意間的類的組合,或者為了設(shè)計某個class的接口,就一不小心把它變成了Container(哈哈哈)。需要注意的是:需要注意的是:適配器模式分為類適配器和對象適配器一定要注意二者的概念和區(qū)別。

          可以詳細去了解下什么是適配器模式,因為它實在太常用了,了解完以后對于回答本文第一個問題也有幫助!

          此外,對于C++開發(fā)者,適配器模式之所以重要,還有個原因:STL中的容器適配器,stack和queue!如果面試官借此延展到對STL的考察~~



          寫在最后



          前面舉的例子僅僅是Jungle根據(jù)個人面試經(jīng)驗總結(jié)而成,其他設(shè)計模式,比如策略模式、組合模式、代理模式,在實際開發(fā)中也經(jīng)常使用到。各位需要根據(jù)面試實際情況早做準備。這些設(shè)計模式在Jungle的《C++設(shè)計模式系列》文章里都有詳細的概念、實例、代碼和應(yīng)用場景介紹。

          還需要說兩點:

          1. 與設(shè)計模式有關(guān)的編程基礎(chǔ)知識

          以C++為例,前面在單例模式的說明里提到了一些問題,實際上都是考察C++類的基礎(chǔ)知識、操作系統(tǒng)基礎(chǔ)知識(鎖、互斥);大部分設(shè)計模式的實現(xiàn)里,都會用到虛函數(shù)、虛基類(多態(tài));繁多的類對象里,如何避免內(nèi)存泄露等等,這些知識同樣重要。否則,當著面試官的面,寫出一套漏洞百出的單例模式,恐怕也是一曲涼涼~

          2. 認識設(shè)計模式

          C++設(shè)計模式這個系列,最開始我僅僅是在剛工作的時候作為基礎(chǔ)知識來學(xué)習(xí)和記錄,并通過一些簡單易懂的例子來coding以加深理解。其實現(xiàn)在而言,我認為初學(xué)者并不需要深入理解掌握每一種設(shè)計模式。隨著工作的深入,某些常用設(shè)計模式和代碼復(fù)用的思想會讓代碼設(shè)計更加清晰并易于擴展





          0、重磅!兩萬字長文總結(jié),梳理 Java 入門進階哪些事(推薦收藏)

          1、講真的:我達成了一個優(yōu)秀的小目標

          2、看完這設(shè)計模式匯總,你確定不加收藏嗎

          瀏覽 75
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  欧美日韩高清不卡 | 日日干夜夜操天天肏 | 亚洲高清免费视频 | 久久黄色小视频 | 波多AV在线 |