合理的使用策略模式可以减少ifelse的编写,便于后续扩展
代码编写流程:
1.定义具体的业务接口,其中需定义一个方法区分对应的类型,后续扩展策略时实现该接口即可
public interface IService {
/**
* 策略模式的KEY
* @return
*/
public String getMethod();
/**
* 业务方法
*/
public void doSomeThings();
}
@Service
public class AddIService implements IService {
@Override
public String getMethod() {
return "add";
}
@Override
public void doSomeThings() {
System.out.println("1+1=2");
}
}
@Service
public class ReduceIService implements IService {
@Override
public String getMethod() {
return "reduce";
}
@Override
public void doSomeThings() {
System.out.println("1-1=0");
}
}
2.定义Fatory类,实现BeanPostProcessor, InitializingBean
@Slf4j
@Service
public class Fatory implements BeanPostProcessor, InitializingBean {
private Map<String, IService> map = new ConcurrentHashMap<>();
@Override
public void afterPropertiesSet() throws Exception {
log.info("Fatory接口服务初始化");
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if(bean instanceof IService){
IService s = (IService)bean;
map.put(s.getMethod(),s);
}
return bean;
}
public IService getService(String method){
if(map.containsKey(method)){
return map.get(method);
}
log.info("未匹配到对应服务");
return null;
}
}
3.业务代码调用
@Service
public class Client {
@Autowired
private Fatory fatory;
public void execute(String key){
IService service = fatory.getService(key);
service.doSomeThings();
}
}