学完23种设计模式,相信很多同学都疑问,除了单例模式、工厂模式其他模式还有运用的场景吗?
现在这里就举一个例子。
首先策略模式需要先有了解,我们常用策略模式解决实际开发中的if else特别多的场景。但是在实际的开发中,真正单独只用策略模式的场景还是很少的。我们需要利用Spring的注入功能,实现根据不同的入参,跳转到不同的实现类中,以此来减少if else的使用。
举个场景:假如我们做物流系统,需要根据前段传过来的渠道参数,来定制化不同的规则校验逻辑。这里我们距离alibaba渠道和wechat渠道。那么我们应该怎么做呢?
大致思路:
1、定义抽象接口,提取一个抽象方法,这个方法的具体实现在各个渠道的类中
2、在service层,通过实现ApplicationContextAware接口,获取spring的applicationContext
3、在service层,通过入参确定需要跳转到哪个类实现定制的渠道规则。
具体代码如下:
第一步:
@Service
public interface Channel {void rule_control();
}
@Service
public class WechatChannel implements Channel {@Overridepublic void rule_control() {System.out.println("进入到微信的渠道来源");}
}
@Service
public class AlibabaChannel implements Channel {@Overridepublic void rule_control() {System.out.println("进入到阿里巴巴的渠道来源");}
}
第二步:在service层的写法:
@Service
public class BuyGoods implements ApplicationContextAware {private ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}public void judgeChannel(String buyGoodsChannel){String finalString = buyGoodsChannel+"Channel";Channel bean = (Channel)applicationContext.getBean(finalString);System.out.println("最终实际得到的bean名称:"+bean.toString());bean.rule_control();}}
最后在controller层传入的参数,模拟如下,结果见如上图:
@RequestMapping("/buy")public String bug(){System.out.println("进入buy...Controller");String channel = "wechat";buyGoods.judgeChannel(channel);return "bug";}
总结:经过上面的简单处理,我们即完成了不同渠道根据入参定制不同实现类的要求,避免了if else的疯狂使用。