Java中多If else优化 (三)----工厂+策略模式优化

时光毁灭记忆、已成空白 提交于 2019-11-28 21:05:24

    看到一篇用工厂+策略模式优化 多If else的文章,感觉非常不错,文章地址如下:

    代码重构:用工厂+策略模式优化过多的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;
	}


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!