如果你希望在介面定義中保持簡潔,並且不想摻雜過多的業務邏輯,可以透過以下方式實現:
- 介面只定義核心操作:
確保介面只包含必要的操作方法,而不涉及具體的實現細節或業務邏輯。
public interface DatabaseQueryStrategy {
void executeQuery(String query);
}
- 在實現類中處理業務邏輯:
將具體的業務邏輯放在介面的實現類中,各個實現類只關注具體資料庫的處理方式。
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查詢的具體實現和業務邏輯
}
}
- 使用配置類進行初始化:
使用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);
}
}
- 上下文類只負責策略管理:
確保上下文類只負責管理策略的選擇和執行,而不是業務邏輯。業務邏輯應該在呼叫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);
}
}
- 在業務層中進行策略選擇:
在業務層中,根據需要選擇和設定策略,而不是在核心介面或上下文中進行。
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());
}
}
透過這種方法,你可以保持介面的簡潔性,並將業務邏輯隔離到具體的實現類和業務層中。這種做法符合物件導向設計的單一職責原則,使得程式碼更易於管理和維護。