博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
策略模式,工厂模式,InitializingBean相结合解决多条件筛选
阅读量:3958 次
发布时间:2019-05-24

本文共 2686 字,大约阅读时间需要 8 分钟。

策略模式,工厂模式,InitializingBean相结合解决多条件筛选

编码中面对日益繁多的if else,switch导致代码越来越臃肿,可读性,可维护性也会急剧下降,这里我们先用策略模式去解决:

策略模式代码:

接口IDemoService
public interface IDemoService {
String getServiceName(); }
实现类Demo1ServiceImpl,Demo2ServiceImpl
@Servicepublic class Demo1ServiceImpl implements IDemoService {
@Override public String getServiceName() {
return "Demo1ServiceImpl"; }}@Servicepublic class Demo2ServiceImpl implements IDemoService {
@Override public String getServiceName() {
return "Demo2ServiceImpl"; }}
控制器
@RestController@RequestMapping("demo")public class DemoController {
@PostMapping("/getServiceName") public String getServiceName(@RequestParam("num") int num) {
IDemoService demoService; if (num == 1) {
demoService = new Demo1ServiceImpl(); } else if (num==2) {
demoService = new Demo2ServiceImpl(); } else {
return null; } return demoService.getServiceName(); }}
结果:
参数num=1时,返回Demo1ServiceImpl;参数num=2时,返回Demo2ServiceImpl;

这样看,随着业务提升还是会有大量的if else;

结合工厂模式,InitializingBean:

接口IDemoService
public interface IDemoService extends InitializingBean {
String getServiceName(); }
工厂类DemoServiceFactory
public class DemoServiceFactory {
private static Map
services = new ConcurrentHashMap<>(); public static IDemoService getByNum(int type) {
return services.get(type); } public static void register(int type, IDemoService demoService) {
Assert.notNull(type, "type can't be null"); services.put(type, demoService); }}
实现类Demo1ServiceImpl,Demo2ServiceImpl
@Servicepublic class Demo1ServiceImpl implements IDemoService {
@Override public String getServiceName() {
return "Demo1ServiceImpl"; } @Override public void afterPropertiesSet() throws Exception {
DemoServiceFactory.register(1, this); }}@Servicepublic class Demo2ServiceImpl implements IDemoService {
@Override public String getServiceName() {
return "Demo2ServiceImpl"; } @Override public void afterPropertiesSet() throws Exception {
DemoServiceFactory.register(2, this); }}
控制器
@RestController@RequestMapping("demo")public class DemoController {
@PostMapping("/getServiceName") public String getServiceName(@RequestParam("num") int num) {
IDemoService demoService = DemoServiceFactory.getByNum(num); return demoService.getServiceName(); }}
结果:
参数num=1时,返回Demo1ServiceImpl;参数num=2时,返回Demo2ServiceImpl;

这样通过工厂的方法将实现类存储在map中,根据传入的值为key,取出对应的实现类,大大减少了代码,后期业务增加的时候也只需要增加对应的实现类即可,无需修改之前的代码!

转载地址:http://dyazi.baihongyu.com/

你可能感兴趣的文章
杭电ACM——1034,Candy Sharing Game
查看>>
杭电ACM——建房子(贪心)
查看>>
杭电ACM——1297,Children’s Queue(递推)
查看>>
杭电ACM——1003,Max Sum(DP)
查看>>
杭电ACM——1042,N!(思维)
查看>>
杭电ACM——1060,Leftmost Digit(思维)
查看>>
杭电ACM——1061,Rightmost Digit(思维)
查看>>
杭电ACM——1087,Super Jumping! Jumping! Jumping!(DP)
查看>>
杭电ACM——fatmouse's speed(DP)
查看>>
杭电ACM——毛毛虫(DP)
查看>>
杭电ACM——humble numbers(DP)
查看>>
杭电ACM——6467,简单数学题(思维)
查看>>
杭电ACM——天上掉馅饼(DP)
查看>>
杭电ACM——1086,You can Solve a Geometry Problem too(思维)
查看>>
杭电ACM——2057,A + B Again(思维)
查看>>
codeforces——1097B,Petr and a Combination Lock(搜索)
查看>>
杭电ACM——2064,汉诺塔III(递推)
查看>>
杭电ACM——2065,"红色病毒"问题(思维)
查看>>
北大ACM——2385,Apple Catching(DP)
查看>>
杭电AM——2072,单词数(暴力)
查看>>