对于一个项目,我们有一个控制器/服务/ DAO架构。我们实行不同提供商的API的调用,所以我们在每一个控制器类结束了与一些像这样的样板代码:设计模式:避免切换决定哪个服务电话
enum {
PARTNER_A, PARTNER_B, PARTNER_C
}
public class MyController {
@Resource PartnerASearchService partnerASearchService;
@Resource PartnerBSearchService partnerBSearchService;
@Resource PartnerCSearchService partnerCSearchService;
public search(InputForm form) {
switch(form.getPartnerName()) {
case PARTNER_A: partnerASearchService.search();
break;
case PARTNER_B: partnerBSearchService.search();
break;
case PARTNER_C: partnerCSearchService.search();
break;
}
}
public otherMethod(InputForm form) {
switch(form.getProvider()) {
case PARTNER_A: partnerAOtherService.otherMethod();
break;
case PARTNER_B: partnerBOtherService.otherMethod();
break;
case PARTNER_C: partnerCOtherService.otherMethod();
break;
}
}
}
我可以使用哪种设计模式在每个控制器摆脱这个开关?我宁愿代码,像下面的东西:
public class MyController {
@Resource ServiceStrategy serviceStrategy;
public search(InputForm form){
serviceStrategy.search(form.getPartnerName())
// or
serviceStrategy.invoke(SEARCH, form.getPartnerName())
}
public otherMethod(InputForm form){
serviceStrategy.other(form.getPartnerName())
// or
serviceStrategy.invoke(OTHER, form.getPartnerName())
}
}
让serviceStrategy决定哪些服务实现被调用,从而获得具有在一个地方合作伙伴的开关。
我用的术语“策略”,因为我已经被告知这种设计模式可以使,但我不知道的最好的方式来使用它,或者是否有更好的方法来解决这个问题。
编辑:我更新了问题,因为术语提供者是误导。我在输入表单中所列的是我们提出请求的合作伙伴的名称。我要决定哪些是正确执行(几个服务的其中之一)的形式来使用基于合作伙伴的名称
有些话题在这里介绍。 http://stackoverflow.com/questions/126409/ways-to-eliminate-switch-in-code –
我假设这个'PROVIDER_1'是'enum'的一部分? –
是的,不要期望这样的编译,......就是我们所做的,就是这样。 PROVIDER_1,2,3,搜索,其他,...枚举 – luso