我認爲你可能需要像Service Locator Pattern
這樣的東西。它有助於根據特定的請求決定您必須使用哪個對象。當您想要訪問您的服務時,它可以減少樣板代碼。
首先,你必須創建interface
與存取方法,您vendor/owner/health
類:
public interface DetailsProvider {
Vendor getVendor();
Owner getOwner();
Health getHealth();
}
你DogDetailsProvider
,CatDetailsProvider
,ElephantDetailsProvider
必須實現該DetailsProvider
接口。你的vendor/owner/health
類必須有接口來保持繼承機制。
然後,你必須創建服務定位:
@Service
public class DetailsProviderLocator {
private DetailsProvider dogDetailsProvider;
private DetailsProvider catDetailsProvider;
private DetailsProvider elephantDetailsProvider;
@Autowired
public DetailsProviderLocator(
@Qualifier("DogDetailsProvider") DetailsProvider dogDetailsProvider,
@Qualifier("CatDetailsProvider") DetailsProvider catDetailsProvider,
@Qualifier("ElephantDetailsProvider") DetailsProvider elephantDetailsProvider) {
this.dogDetailsProvider = dogDetailsProvider;
this.catDetailsProvider = catDetailsProvider;
this.elephantDetailsProvider = elephantDetailsProvider;
}
DetailsProvider getDetailsProvider(Animal animal) {
switch(animal) {
case CAT : return catDetailsProvider;
case DOG : return dogDetailsProvider;
case ELEPHANT : return elephantDetailsProvider;
default : throw new IllegalArgumentException("Not allowed!");
}
}
}
public enum Animal {
CAT, DOG, ELEPHANT;
}
現在取決於枚舉(可以是任何東西,取決於你的要求)的服務定位器將返回特定的服務。擴展也很容易,由於繼承,您可以創建新的服務併爲枚舉添加新的值。
謝謝你的詳細解答。我是否也必須在dogdetailsprovider等類中加入限定符? – fiddle
是否可以添加示例調用來運行此代碼 – fiddle
您必須添加限定符,因爲您將擁有多個「DetailsProvider」類型的Bean, – ByeBye