看到一篇用工厂+策略模式优化 多If else的文章,感觉非常不错,文章地址如下:
文章中利用工厂和策略模式对多个if else 语句进行了优化,其思路:
1、定义一个处罚的接口,包含一个执行处罚的方法 2、每一种情况的处罚都抽象成一个具体处罚类并继承处罚接口(策略模式) 3、定义一个静态工厂类,用来根据情况生产具体处罚对象,然后执行处罚的方法(静态工厂模式)。 |
其中具体处罚类中除了继承处罚接口外,还实现了InitializingBean接口,在具体处罚类的afterPropertiesSet方法中,将自身注册到静态工厂类的Map<String, 处罚接口>中。优缺点如作者所言,
重构后的处罚逻辑简单、清晰,后续新增一种情况,只需定义一个相应的类即可,根本不需要修改处罚逻辑,完全解耦合,这大大提高了代码的可读性和可维护性。 不过,运用静态工厂+策略模式,也存在弊端,那就是会增加很多类;但是,当每种情况的逻辑代码很多、很复杂的时候,那么这个弊端就可以忽略不计,其优势就完全展示出来了。 |
工作项目中也有用到类似方式实现不同数据的处理,但与文章中示例方式略有不同:
文章示例中定义一个静态工厂类,业务类统一接口和各具体业务类,由具体业务类实现InitializingBean接口,具体业务类初始化时,将自身注册到静态工厂类中的Map<string , 业务类统一接口>中。
工作项目中定义一个静态工厂类,业务类统一接口和各具体业务类,由静态工厂类实现InitializingBean接口,通过读取XML配置文件中信息,XML配置文件中为String与具体业务类名的对应关系,利用Spring上下文ApplicationContext.getBean方法,将具体业务实现类注册到Map<String, 业务类统一接口中。
附:
1、InitializingBean说明
InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法。
import org.springframework.beans.factory.InitializingBean;
/**
* @Description:
* @Author:
* @CreateDate:
*/
public class InitializingBeanTest implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("InitializingBeanTest......");
}
}
2、ApplicationContextAware说明
作用:手动或动态获取Spring容器中的bean。
创建一个类,实现ApplicationContextAware接口在该类中定义ApplicationContext静态变量 ,并对setApplicationContext方法进行重写。
public class SpringContextHolder implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
/**
* 实现ApplicationContextAware接口, 注入Context到静态变量中.
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
SpringContextHolder.applicationContext = applicationContext;
/**
* 获取静态变量中的ApplicationContext.
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
来源:CSDN
作者:Damon-JT
链接:https://blog.csdn.net/u012475575/article/details/80969183