首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2EE

J2EE 核心設計模式深度解析:MVC、Front Controller、Session Facade 與 DAO

     編輯:J2EE

前言:什麼是設計模式?

設計模式是經驗證可行、可重用、具伸縮性的常見問題解決方案資源庫。在 J2EE 應用開發中,這四大模式能有效分離關注點、降低耦合、提升維護性。

一、Model-View-Controller (MVC)

問題

面對 PDA、WAP、桌面瀏覽器等多樣 Client,若無架構分離,資料存取與表現邏輯混雜,導致重複存取碼、開發週期拉長。

解決方案

MVC 架構圖

  • Model:企業資料與商業邏輯(EJB)。
  • View:多頁面組成,依 Client 需求顯示資料,Model 變更時自動更新。
  • Controller:接收用戶動作,轉換為 Model 可執行請求,依執行結果決定下一個 View。

關鍵優勢

  • 適用多用戶、可擴展、高互動系統。
  • 分離流控制與資料表現,釐清開發職責、加速上市。
  • 多 View 支援新 Client 類型,程式碼重複度最低。

二、Front Controller(前端控制器)

問題

高互動頁面間依賴性強,無模式時為獨立頁面集合,維護困難:頁面移動需改所有連結、密碼保護需改大量設定、新表現層需重排標記。

解決方案

所有請求導向單一 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
}

適用性與權衡

  • 適合複雜動態導航、需模板/轉換的應用。
  • View 導航集中易懂、易配置、易重用。
  • 複雜互動可能導致 Controller 膨脹,可用 XML 映射緩解。
  • 不適合純靜態小型應用。

三、Session Facade(工作階段外觀)

問題

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);

適用原則

  • 用於無資料存取、純工作流協調的 Session Bean。
  • 不適用無流程處理的應用。

四、Data Access Object (DAO)

問題

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);
}

關鍵優勢與代價

  • 分離業務邏輯與資料存取,特別適合 BMP,亦可移植 CMP。
  • 部署時選擇資料源類型,增強伸縮性。
  • 無資料存取限制(可存取 XML 等)。
  • 代價:增加額外物件,一定程度提高複雜度。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved