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

分層架構實戰:如何精準劃分 Action、Service、DAO 職責

     編輯:Java 相關知識

反面教材:所有邏輯塞進 Action

public String addUser() {
    if (user == null) return FAIL_NO_USER;
    Result result = null;
    if (Role.ADMIN.equals(user.getRole())) {
        result = doSomethingForAdmin(user);
    } else {
        result = doSomethingForOthers(user);
    }
    Transaction trans = sess.beginTransaction();
    Query query = sess.createQuery("update Result set level = :level");
    query.setParameter("level", result.getLevel());
    query.executeUpdate();
    trans.commit();
    sess.close();
    return SUCCESS;
}

頁面邏輯、業務規則、數據訪問、事務控制糅雜一塊,測試困難、復用為零、維護噩夢。

分層鐵律

層核心職責禁止事項
Action(控制層)處理 HTTP 請求/響應、參數校驗、視圖導航、Session 管理不操作業務對象、不含業務規則、不直接訪問數據庫
Service(業務層)封裝業務規則、跨多個業務對象協調、事務邊界控制不依賴 Web 技術、不操作 HttpServletRequest/Response、不寫 SQL
DAO(數據訪問層)單一業務對象的 CRUD、複雜查詢、持久化細節封裝不包含業務規則、不跨業務對象操作

重構後範例

// Action
public String addUser() {
    if (user == null) return FAIL_NO_USER;
    Result result = userService.process(user); // 業務委託
    resultDao.update(result);                  // 持久化委託
    return SUCCESS;
}

// Service
public Result process(User user) {
    if (Role.ADMIN.equals(user.getRole())) return doSomethingForAdmin(user);
    return doSomethingForOthers(user);
}

// DAO
public void update(Result result) {
    Transaction trans = sess.beginTransaction();
    Query query = sess.createQuery("update Result set level = :level");
    query.setParameter("level", result.getLevel());
    query.executeUpdate();
    trans.commit();
    sess.close();
}

分層帶來的實質收益

  1. 可讀性質變:每層方法語義單一,閱讀無干擾。
  2. 測試策略分層:Action 單測 Mock Service;Service 單測 Mock DAO/集成測試真實 DB;DAO 集成測試驗證 SQL。
  3. 變更隔離:頁面流程變動只動 Action;業務規則變動只動 Service;表結構變動只動 DAO。

動態演進觀

分層邊界非一成不変:

  • Action 中的頁面控制邏輯若被多處復用、上升為業務規則 → 下沉到 Service
  • DAO 中若包含跨表業務邏輯 → 上浮到 Service
  • Service 若退化為單純頁面流程控制 → 重構回 Action

持續重構,保持「高內聚、低耦合、職責單一」是核心。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved