外觀模式屬於結構型模式,為子系統中的一組介面提供一個統一的高層介面,使子系統更易於使用。它不封裝子系統,只是提供一個簡化的入口,客戶端仍可直接訪問子系統。
每次操作資料庫都要寫:載入驅動、獲取連接、創建 Statement、處理 ResultSet、關閉資源... 代碼冗長、易出錯、難維護。切換資料庫(MySQL→Oracle)更需修改所有調用處。
// 1. 定義統一外觀介面
public interface DbFacade {
Connection getConnection() throws SQLException;
void close(Connection conn, Statement stmt, ResultSet rs);
// 可添加 executeQuery, executeUpdate 等便利方法
}
// 2. MySQL 實現
public class MysqlFacade implements DbFacade {
private static final String URL = "jdbc:mysql://...";
private static final String USER = "root";
private static final String PASS = "123456";
static { Class.forName("com.mysql.jdbc.Driver"); }
public Connection getConnection() { return DriverManager.getConnection(URL, USER, PASS); }
public void close(Connection c, Statement s, ResultSet r) { /* 統一關閉邏輯 */ }
}
// 3. 客戶端極度簡化
public class Client {
public void query() {
DbFacade db = new MysqlFacade(); // 或從工廠獲取
Connection conn = db.getConnection();
PreparedStatement ps = conn.prepareStatement("SELECT * FROM t WHERE id=?");
ps.setString(1, "100");
ResultSet rs = ps.executeQuery();
// 處理結果...
db.close(conn, ps, rs);
}
}
只需修改 MysqlFacade 內部實現(如整合 HikariCP/Druid),客戶端代碼零修改即可享受連接池性能提升。
| 優點 | 缺點 |
|---|---|
| 極大簡化客戶端調用 | 可能違反單一職責(外觀類過於臃腫) |
| 解耦客戶端與子系統 | 若客戶端需深度定制,外觀反成阻礙 |
| 便於分層架構(如 Service 層作為 Facade) |
外觀模式不神秘,你可能已在無意識中使用。關鍵在於識別「高頻、固定組合」的操作序列,將其封裝為語義清晰的單一介面。