策略模式,工厂模式,InitializingBean相结合解决多条件筛选
编码中面对日益繁多的if else,switch导致代码越来越臃肿,可读性,可维护性也会急剧下降,这里我们先用策略模式去解决:
策略模式代码:
接口IDemoService
public interface IDemoService {
String getServiceName();
}
实现类Demo1ServiceImpl,Demo2ServiceImpl
@Service
public class Demo1ServiceImpl implements IDemoService {
@Override
public String getServiceName() {
return "Demo1ServiceImpl";
}
}
@Service
public 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<Integer, IDemoService> 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
@Service
public class Demo1ServiceImpl implements IDemoService {
@Override
public String getServiceName() {
return "Demo1ServiceImpl";
}
@Override
public void afterPropertiesSet() throws Exception {
DemoServiceFactory.register(1, this);
}
}
@Service
public 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,取出对应的实现类,大大减少了代码,后期业务增加的时候也只需要增加对应的实现类即可,无需修改之前的代码!