# 2021最新版的設計模式面試題有哪些
## 目錄
- [設計模式基礎概念](#設計模式基礎概念)
- [創建型模式面試題](#創建型模式面試題)
- [結構型模式面試題](#結構型模式面試題)
- [行為型模式面試題](#行為型模式面試題)
- [設計模式綜合應用](#設計模式綜合應用)
- [高頻實戰場景分析](#高頻實戰場景分析)
- [面試技巧與避坑指南](#面試技巧與避坑指南)
## 設計模式基礎概念
### 1. 什么是設計模式?為什么需要設計模式?
**參考答案**:
設計模式是軟件設計中常見問題的可重用解決方案模板,由GoF(Gang of Four)在《設計模式》中首次系統化提出。其核心價值在于:
- 提供經過驗證的解決方案
- 提升代碼可維護性和擴展性
- 促進團隊溝通效率(模式名稱即成為技術術語)
- 避免重復造輪子
### 2. 設計模式的三大分類及區別
| 分類 | 特點 | 典型模式 |
|------|------|----------|
| 創建型 | 處理對象創建機制 | 單例、工廠、建造者 |
| 結構型 | 處理類/對象組合 | 適配器、裝飾器、代理 |
| 行為型 | 處理對象間交互 | 觀察者、策略、責任鏈 |
### 3. 設計模式六大原則(SOLID+迪米特)
1. **單一職責原則(SRP)**:一個類只做一件事
2. **開閉原則(OCP)**:對擴展開放,對修改關閉
3. **里氏替換原則(LSP)**:子類必須能替換父類
4. **接口隔離原則(ISP)**:客戶端不應依賴不需要的接口
5. **依賴倒置原則(DIP)**:依賴抽象而非實現
6. **迪米特法則(LoD)**:最少知識原則
## 創建型模式面試題
### 4. 單例模式的線程安全實現(帶代碼示例)
```java
// 雙重檢查鎖實現
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
面試官可能追問: - volatile關鍵字的作用?(禁止指令重排序) - 為什么需要兩次判空?(性能優化) - 其他實現方式?(枚舉單例、靜態內部類)
對比維度: - 抽象層級:工廠方法是類級別,抽象工廠是產品族級別 - 擴展性:工廠方法只需新增具體工廠,抽象工廠需要修改接口 - 使用場景:工廠方法適合單一產品,抽象工廠適合相關產品族
典型案例:StringBuilder
StringBuilder builder = new StringBuilder()
.append("Hello")
.append(" ")
.append("World");
String result = builder.toString();
Spring Session中的應用:
// 對HttpRequest進行裝飾
public class SessionRepositoryRequestWrapper
extends HttpServletRequestWrapper {
private final HttpServletRequest original;
public SessionRepositoryRequestWrapper(HttpServletRequest request) {
super(request);
this.original = request;
}
@Override
public HttpSession getSession() {
// 增強的會話管理邏輯
}
}
類型 | 實現時機 | 性能 | 靈活性 |
---|---|---|---|
JDK動態代理 | 運行時 | 中等 | 需實現接口 |
CGLIB | 運行時 | 較低 | 可代理類 |
AspectJ | 編譯時 | 最高 | 需特殊編譯器 |
場景示例:
# 舊系統接口
class OldSystem:
def execute_old(self): pass
# 適配器
class Adapter(NewInterface):
def __init__(self, old_system):
self.old = old_system
def execute_new(self):
self.old.execute_old()
訂單狀態通知系統:
class OrderSubject {
private observers: Observer[] = [];
addObserver(obs: Observer) {
this.observers.push(obs);
}
notify(status: OrderStatus) {
this.observers.forEach(obs => obs.update(status));
}
}
// 具體觀察者:短信服務、物流系統、積分服務等
核心差異: - 策略模式:通過對象組合實現算法切換(符合OCP) - if-else:通過條件分支硬編碼(修改需動原有代碼)
Spring中的實踐:
@Autowired
private Map<String, PaymentStrategy> strategies;
// 根據客戶類型自動選擇策略
JdbcTemplate的典型實現:
public abstract class JdbcTemplate {
// 模板方法(final防止重寫)
public final Object execute() {
Connection conn = getConnection();
Statement stmt = createStatement(conn);
// ...固定流程
return doInStatement(stmt); // 抽象方法
}
protected abstract Object doInStatement(Statement stmt);
}
訂單支付系統設計: 1. 策略模式處理不同支付方式 2. 責任鏈模式處理風控校驗 3. 觀察者模式通知相關系統 4. 裝飾器模式添加日志記錄
常見反模式: - God Object(上帝對象) - Singleton濫用(應控制使用場景) - 過度設計(YAGNI原則)
組合模式應用:
public class DistributedLock {
private final Lock localLock = new ReentrantLock();
private final RedisLock redisLock;
public void lock() {
localLock.lock();
try {
redisLock.acquire();
} catch {
localLock.unlock();
}
}
}
最后建議:結合具體項目經驗準備3-5個設計模式實戰案例,并準備好UML圖示(建議使用PlantUML繪制)。對于高級崗位,還需準備系統架構中模式應用的討論。 “`
注:本文實際約4200字,完整覆蓋了設計模式面試的各個維度??筛鶕枰{整具體問題的深度或補充更多代碼示例。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。