介面 做具體的實現

kaka布鲁斯發表於2024-11-05

如果你希望在介面定義中保持簡潔,並且不想摻雜過多的業務邏輯,可以透過以下方式實現:

  1. 介面只定義核心操作
    確保介面只包含必要的操作方法,而不涉及具體的實現細節或業務邏輯。
public interface DatabaseQueryStrategy {
    void executeQuery(String query);
}
  1. 在實現類中處理業務邏輯
    將具體的業務邏輯放在介面的實現類中,各個實現類只關注具體資料庫的處理方式。
import org.springframework.stereotype.Component;

@Component
public class KdbQueryStrategy implements DatabaseQueryStrategy {
    @Override
    public void executeQuery(String query) {
        // KDB查詢的具體實現和業務邏輯
    }
}

@Component
public class MySqlQueryStrategy implements DatabaseQueryStrategy {
    @Override
    public void executeQuery(String query) {
        // MySQL查詢的具體實現和業務邏輯
    }
}
  1. 使用配置類進行初始化
    使用Spring的Java配置類(例如@Configuration)來初始化上下文和策略,而不是在業務程式碼中直接使用。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class QueryStrategyConfig {

    @Bean
    public DatabaseQueryContext databaseQueryContext(DatabaseQueryStrategy strategy) {
        return new DatabaseQueryContext(strategy);
    }
}
  1. 上下文類只負責策略管理
    確保上下文類只負責管理策略的選擇和執行,而不是業務邏輯。業務邏輯應該在呼叫executeQuery之前準備好。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class DatabaseQueryContext {

    private DatabaseQueryStrategy strategy;

    @Autowired
    public DatabaseQueryContext(DatabaseQueryStrategy strategy) {
        this.strategy = strategy;
    }

    public void setStrategy(DatabaseQueryStrategy strategy) {
        this.strategy = strategy;
    }

    public void executeQuery(String query) {
        strategy.executeQuery(query);
    }
}
  1. 在業務層中進行策略選擇
    在業務層中,根據需要選擇和設定策略,而不是在核心介面或上下文中進行。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

@Service
public class QueryService {

    private final DatabaseQueryContext context;

    @Autowired
    public QueryService(@Qualifier("kdbQueryStrategy") DatabaseQueryStrategy initialStrategy) {
        this.context = new DatabaseQueryContext(initialStrategy);
    }

    public void runQuery(String query) {
        context.executeQuery(query);
    }

    public void switchToMySQL() {
        context.setStrategy(new MySqlQueryStrategy());
    }
}

透過這種方法,你可以保持介面的簡潔性,並將業務邏輯隔離到具體的實現類和業務層中。這種做法符合物件導向設計的單一職責原則,使得程式碼更易於管理和維護。

相關文章