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

面向介面程式設計淺析:從緊耦合到依賴注入的演進

     編輯:Java 相關知識

「面向介面程式設計」不只是口號,而是為了可維護性與可擴展性。本文透過登入功能實例,層層剖析從「硬編碼具體類」→「工廠模式」→「依賴注入」的演進邏輯,並結合 Spring 配置示範鬆耦合實踐。

為何需要介面?

若類別 A 直接 new B(),則 A 緊耦合 B。業務變更需改用 C 時,必須修改 A 原始碼並重新編譯——大型系統代價極高。介面打破具體依賴:

interface IUserDao {
    void insertUser();
    boolean getUserByName(String name);
}

實作類別 UserDaoImp 實作介面,上層只依賴 IUserDao,變更實作無需動上層代碼。

分層架構範例

DAO 層

abstract class DaoBase { 
    private User user; 
    public User getUser() { return user; } 
    public void setUser(User user) { this.user = user; } 
}

class UserDaoImp extends DaoBase implements IUserDao {
    public void insertUser() {
        User user = new User();
        user.setAge(23); user.setName("hth"); user.setPassword("123456");
        setUser(user);
    }
    public boolean getUserByName(String name) {
        insertUser();
        return getUser().getName().equals(name);
    }
}

// 為 Spring 注入準備的裝飾類
class UserDaoDeco extends UserDaoImp {}

Service 層:工廠模式管理 Service

interface IServiceFactory {
    UserService getUserService();
    // 其他 service getter...
}

class ServiceFactory implements IServiceFactory {
    private UserDaoDeco userDaoDeco; // Spring 注入
    public void setUserDaoDeco(UserDaoDeco udd) { this.userDaoDeco = udd; }
    public UserService getUserService() {
        return new UserServiceImp(userDaoDeco);
    }
}

Action 僅注入 IServiceFactory,透過工廠取得 Service,Action 與具體 Service 實作解耦。

Spring 配置實現依賴注入

<bean id="userDaoDeco" class="com.ssh2demo.dao.UserDaoDeco"/>

<bean id="serviceFactory" class="com.ssh2demo.service.ServiceFactory">
    <property name="userDaoDeco"><ref bean="userDaoDeco"/></property>
</bean>

<bean id="loginAction" class="com.ssh2demo.struts2.LoginAction" singleton="false">
    <property name="service"><ref bean="serviceFactory"/></property>
</bean>
  • userDaoDeco 實例由 Spring 管理
  • serviceFactory 透過 setter 注入 userDaoDeco
  • loginAction 注入 serviceFactory(介面型別),完全不關心具體實作

依賴注入 = 「打針」

類別像中空球體,Setter 是小孔。配置文件決定往裡塞什麼:要 UserDaoImp 就注入它,要換 MockUserDao 測試也只改配置。控制反轉 (IoC) 將「建立依賴關係」的控制權從類別內部移至外部容器。

總結

  1. 介面隔離變化,實現「新增而非修改」
  2. 工廠模式進一步封裝建立邏輯
  3. 依賴注入 (DI) 徹底外部化依賴關係,配置文件成「接線圖」
  4. Spring 等容器自動完成接線,業務代碼專注核心邏輯

這就是面向介面程式設計的精髓:依賴抽象,不依賴具體。

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