設計模式面試 - Hamill

banq發表於2022-02-28

帶有 4 個示例面試問題的設計模式概述,可幫助您完成下一次面試
設計模式是軟體工程世界的重要組成部分。簡而言之,設計模式是軟體設計和開發中常見問題的可重用解決方案。它們就像我們可以用來在程式碼中實現解決方案的藍圖。
設計模式在面試中也出現了很多!面試官希望看到你知道設計模式的用途以及它們為何重要。他們還想知道您個人使用過哪些設計模式。
在本文中,我想概述這些設計模式是什麼,並舉例說明如何在實際場景中使用這些設計模式。最後,我還會舉四個我個人在過去求職中遇到的面試問題的例子。
 
設計模式概述
首先,我想描述一下設計模式是如何分解的,並對每一種模式進行簡要描述。
根據著名的《設計模式:可重用物件導向軟體的要素》一書,共有 23 種設計模式,根據其用途可分為三類:
Creational建立型:抽象例項化過程的模式,以幫助使系統獨立於其物件的建立方式。
  1. 抽象工廠- 提供用於建立相關物件系列的介面,而無需指定它們的實際類。
  2. Builder - 將物件的構造與其表示分離,以便可以利用構造過程來建立不同的表示。
  3. 工廠方法- 定義一個介面來建立一個物件,同時讓子類決定要例項化哪個類。
  4. 原型 -允許透過克隆原型來建立物件。
  5. Singleton -確保一個類只有一個例項和一個全域性訪問點,可供所有需要訪問它的人訪問。

 
結構型:透過識別定義實體之間關係的方法來簡化大型物件結構設計的模式。
  1. Adapter -允許兩個不相關的介面透過 Adapter 類一起工作。Adapter 類是兩個原本不相容的類之間的連結。
  2. Bridge -透過在它們之間提供一個橋接 類,將抽象類與其實現分離,以便兩者可以相互獨立地變化。
  3. 組合 -用於以類似的方式將一組物件視為單個物件,方法是根據樹結構組合這些物件以表示部分-整體層次結構。(部分-整體層次結構是由子系統或元件組成的系統,這些子系統或元件可以進一步分為更小的元件)。
  4. 裝飾器 -動態地將附加職責附加到物件,為擴充套件功能提供子類化的靈活替代方案。
  5. Facade -為子系統中的一組介面定義一個簡化的介面。這被用作一個高階介面,使其他一切都更容易使用。
  6. Flyweight -定義可以同時在多個上下文中使用的共享物件,有助於降低整個系統的記憶體利用率。
  7. 代理 -為另一個物件提供一個佔位符以控制對其的訪問。本質上是一個類,用作系統中另一個物件的介面。

 
行為型:定義系統中物件之間通用通訊模式的模式。這些模式涉及物件之間的職責分配,或將行為封裝在物件中並將請求委託給它。
  1. 責任鏈 -透過給多個物件一個處理請求的機會來避免將請求的傳送與其接收者耦合。這種模式沿著一個鏈傳遞請求,直到一個物件處理它。
  2. 命令 -將請求封裝到一個獨立物件中,該物件包含有關請求執行的所有資訊。這允許我們使用不同的請求引數化客戶端,記錄請求並支援通常可撤消的操作。
  3. 直譯器 -定義語言中語法的表示以及使用該表示來解釋語言中的句子的直譯器。這種模式廣泛用於面嚮物件語言的編譯器中。
  4. 迭代器 -提供一種按順序訪問聚合物件中的元素的方法,而無需暴露這些物件的底層表示。
  5. 中介者 -定義一個物件,該物件封裝一組物件如何相互互動。這種模式使物件不會顯式地相互引用,並允許您獨立地改變它們的互動。
  6. Memento -在不違反封裝的情況下捕獲和外部化物件的內部狀態,這允許物件稍後恢復到該狀態。
  7. 觀察者 -允許物件釋出對其狀態的更改,而其他物件訂閱以立即收到這些更改的通知。
  8. 狀態 -允許物件在其內部狀態發生變化時改變其行為。
  9. 策略 -也稱為策略,此模式定義了一系列演算法,封裝每個演算法並使它們可互換。這允許演算法獨立於使用它的客戶端而變化。
  10. 模板方法 -允許子類在不改變演算法結構的情況下重新定義演算法的步驟。該演算法是一個框架,將一些步驟推遲到這些子類。
  11. 訪問者 -表示要對物件結構的元素執行的操作。允許您定義新操作,而無需修改其操作的元素的類。

 

4 個帶示例答案的面試問題

  • 1)您使用過哪些設計模式?

這可能是您在求職中會遇到的最常見的一種,儘管對於應屆畢業生來說不太常見。面試官希望看到你在整個職業生涯中實際使用過設計模式。
答: “在我目前的專案中,我在很多場景中都使用了觀察者模式。例如,我們有一個監控子系統,當事件發生時,它會改變我們資料庫中不同監控元件的狀態。當這些狀態發生變化時,我們有多個訂閱者需要收到狀態變化的通知。觀察者模式透過建立單個類來監控這些元件的狀態並根據需要通知訂閱者,從而幫助刪除其他冗餘程式碼。”
  • 2)什麼是設計模式?

這對於應屆畢業生來說比較常見,因為面試官只是想看看你對設計模式有基本的瞭解。
答:“設計模式是解決軟體設計和開發中常見問題的可重用解決方案。它們有助於解決重複程式碼、冗餘邏輯、可擴充套件性等問題。”
  • 3) 為什麼設計模式很重要?

這對於應屆畢業生來說絕對是一個常見的問題。面試官想確保你知道什麼是設計模式以及為什麼使用它們。
答: “設計模式很重要,因為它們可以幫助開發人員編寫乾淨、可讀和可維護的程式碼。它使開發人員的生活更輕鬆,因為他們不必為一個問題重新發明輪子。相反,他們可以利用這些已被證明有效的知名設計模式。根據我的經驗,另一個巨大的好處是設計模式有助於工程師之間的溝通。當您使用通用設計模式解釋系統設計時,其他工程師可以更輕鬆地在腦海中描繪設計。”
  • 4) 你能告訴我什麼是單例類,什麼時候它可能有用嗎?

我在兩次針對基於 Java 的角色的不同採訪中遇到了這個問題。
單例模式可能是軟體工程中最廣為人知且最容易實現的設計模式,所以這似乎是你在面試時想知道的關鍵。
我會提到,這些天單例模式有點不受歡迎。它可能會引入緊密耦合並使測試變得更難,因為您無法像通常那樣模擬元件。但是,根據我的經驗,它仍然會在面試中出現很多。
答: “單個類是一個類,其中該類的一個例項只能存在於應用程式中。在 Java 中,這可以透過建立一個私有建構函式來實現,該建構函式帶有一個儲存其結果的欄位,以及一個像 getInstance() 這樣的靜態訪問器方法。當您需要一個物件來協調整個系統的操作時,這種型別的類很有用。”

 

結論
簡而言之,您希望能夠自如地解釋設計模式是什麼,為什麼要在軟體工程中使用它們,並且能夠解釋您在職業生涯中使用過的設計模式。

參考:https://www.jdon.com/designpatterns/

相關文章