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

Java DAO 層接口繼承設計:BaseDao、UserService 多層接口的必要性

     編輯:程式設計疑難解答

代碼結構

public interface BaseDao {}                    // 通用 CRUD
public abstract class BaseDaoImpl implements BaseDao {}

public interface UserService extends BaseDao {} // 用戶業務 + 通用
public class UserServiceImpl extends BaseDaoImpl implements UserService {}

疑問

UserServiceImpl 已繼承 BaseDaoImpl 擁有通用方法,為何 UserService 還要 extends BaseDao?

設計原理解析

1. 接口隔離與多態注入

  • BaseDao 定義**通用數據訪問契約**(save、delete、findAll...)。
  • UserService 定義**用戶業務契約**(register、login、changePassword...)。
  • UserService extends BaseDao 使 UserService **同時擁有兩類契約**,任何需要「用戶業務+通用查詢」的依賴方可直接依賴 UserService 接口。

2. 橋接模式雛形

  • 抽象層:BaseDao(通用)、UserService(業務)
  • 實現層:BaseDaoImpl(通用實現)、UserServiceImpl(業務實現+繼承通用)
  • 客戶端針對接口編程,可替換實現(如換 MyBatis/JPA 實現 BaseDaoImpl)。

3. 依賴倒置原則 (DIP) 落地

// Service 層注入
@Service
public class OrderService {
    @Autowired
    private UserService userService; // 既能調用 userService.findAll(),也能調用 userService.register()
}

若 UserService 不繼承 BaseDao,OrderService 需同時注入 UserService 和 BaseDao,增加耦合。

若不繼承會怎樣?

  • 編碼層面:UserServiceImpl 仍可調用父類方法,**功能不受影響**。
  • 架構層面:接口契約不完整,失去「面向接口編程」的多態優勢,依賴方無法統一使用 UserService 進行通用操作。

總結

UserService extends BaseDao 是為了**接口契約的完整性與多態注入便利性**,屬於經典的 DAO 模式 + 橋接模式 結合。實現類繼承關系(extends BaseDaoImpl)解決代碼復用,接口繼承關系解決類型契約與依賴管理。**兩者各司其職,不可混淆**。

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