設計模式是經驗證可行、可重用、具伸縮性的常見問題解決方案資源庫。在 J2EE 應用開發中,這四大模式能有效分離關注點、降低耦合、提升維護性。
面對 PDA、WAP、桌面瀏覽器等多樣 Client,若無架構分離,資料存取與表現邏輯混雜,導致重複存取碼、開發週期拉長。

高互動頁面間依賴性強,無模式時為獨立頁面集合,維護困難:頁面移動需改所有連結、密碼保護需改大量設定、新表現層需重排標記。
所有請求導向單一 Front Controller 物件:處理請求、決定 View、實作安全需求。集中管理使修改輕易反映所有 View。搭配 XML 映射檔(RequestMappings.xml)定義 URL、Handler、下一頁、安全檢查,Controller 程式碼極簡,維護僅需改 XML。
// FrontControllerImpl.java 核心邏輯
public void doGet(HttpServletRequest request, HttpServletResponse response) {
String currentPage = request.getPathInfo();
// 從 HashMap 取得 mapping 資訊
// 安全檢查、委派 Handler、forward 至 nextScreen
}
Servlet 直接呼叫多個 EJB 完成工作流(如下單需檢查帳戶、信用、核准、送單),導致:Client 與 EJB 緊耦合、EJB 變更波及所有 Client、網路呼叫頻繁降低效能、多 Client 類型需重複工作流邏輯。
引入 Session Bean 作為 Facade,封裝 EJB 互動細節,對外提供單一粗粒度業務方法(如 placeOrder())。Client 僅呼叫 Facade,EJB 內部流程變更不影響 Client,減少網路往返,隱藏伺服端實作細節,支援多 Client 類型,集中處理安全/記錄。
// OrderSessionFacade 封裝工作流
public int placeOrder(String customerId, Details orderDetails) {
// 內部查找 UserAccount、CreditCheck、Approvals、CommitOrder EJB
// 執行完整工作流,回傳 orderId
}
// Servlet Client 變極簡
OrderSessionFacade facade = facadeHome.create();
int orderId = facade.placeOrder(customerId, currentOrder);
EJB 內嵌 SQL 導致:資料庫變更牽動 SQL 修改、EJB 需重編譯、業務邏輯與資料存取耦合難維護。
將資料存取邏輯抽離至獨立 DAO 介面/實作。EJB 保留業務邏輯,透過 DAO 存取資料。修改資料存取僅更新 DAO 物件。支援多資料源類型:部署時指定 DAO 實作,或透過 Factory 取得 DAO。
// UserAccountDAO 封裝所有資料存取
public UserDetails getUserDetails(String userId) { ... }
// UserAccountEJB 僅委派
public UserDetails getUserDetails(String userId) {
UserAccountDAO dao = new UserAccountDAO();
return dao.getUserDetails(userId);
}