本文共 2686 字,大约阅读时间需要 8 分钟。
编码中面对日益繁多的if else,switch导致代码越来越臃肿,可读性,可维护性也会急剧下降,这里我们先用策略模式去解决:
public interface IDemoService { String getServiceName(); }
@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;
public interface IDemoService extends InitializingBean { String getServiceName(); }
public class DemoServiceFactory { private static Mapservices = 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); }}
@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/