我认为你可能需要像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