缩减项目代码中的大面积if策略

参考设计模式 - 策略模式咱们能够优化if-else代码段,而在Spring(Boot)中,借助ApplicationContext扫描,能够使代码更加干净。

话很少说,亮代码:java

首先按照策略模式的写法,建立一个Handle接口,用于区分处理策略。

public interface ITypeHandle {
    /**
     * 不一样的业务操做
     *
     * @return 对应的操做结果
     */
    String working();

    /**
     * 声明用于处理的业务(方便查看而已)
     *
     * @return 业务名称
     */
    String handleType();
}

而后建立对应的唤醒处理机和睡觉处理机

// 起床操做
public class WakeTypeHandle implements ITypeHandle {
    @Override
    public String working() {
        try {
            // 模拟业务操做
            Thread.sleep(100);
        } catch (Exception ex) {
            return "Wake Interrupt";
        }
        return "Wake up Wake up Wake up";
    }

    @Override
    public String handleType() {
        return "wake";
    }
}
// 睡觉操做
public class SleepTypeHandle implements ITypeHandle {
    @Override
    public String working() {
        try {
            // 模拟业务操做
            Thread.sleep(500);
        } catch (Exception ex) {
            return "Sleep Interrupt";
        }
        return "Sleep Sleep Sleep Zzzzzzzzzzzzz";
    }

    @Override
    public String handleType() {
        return "sleep";
    }
}

简单来讲,策略模式的操做方式是经过上下文切换不一样的处理机来处理不一样的业务。在Spring中,能够借助ApplicationContext和ComponentScan来完成。spring

创建策略工厂

public class TypeHandleFactory {
    private Map<String , ITypeHandle> map;

    @Autowired
    private ApplicationContext applicationContext;

    @PostConstruct
    private void init(){
        Map<String ,ITypeHandle> beans=applicationContext.getBeansOfType(ITypeHandle.class);
        map= new HashMap<>(beans.size());
        for (ITypeHandle handle : beans.values()) {
            map.put(handle.handleType(),handle);
        }
    }
    public ITypeHandle getInstance(String type){
        return map.get(type);
    }
}

这里的初始化应当在ApplicationContext注入完成后进行,所以添加@PostConstruct注解。在Spring中,类执行主要注解的顺序为构造方法=>@Autowired=>@PostConstruct=>@PreDestroy=>销毁。另外须要在策略工厂和两个处理机上添加@Component注解或由@ComponentScan扫描。

添加一个Service类来模拟业务层:

@Service
public class MainServiceImpl {
    @Autowired
    private TypeHandleFactory factory ;
    @Override
    public String work(String type){
        ITypeHandle handler = factory.getInstance(type);
        return handler.working();
    }
}

至此,咱们已经完成了策略模式在Spring中的构建。能够编写测试类测试:设计模式

@SpringBootTest
class MainServiceImplTest {
    @Autowired
    private MainServiceImpl service;
    @Test
    void work(){
        String typeA="wake";
        String typeB="sleep";
        System.out.println(service.work(typeA));
        System.out.println(service.work(typeB));
    }
}

日志打印为:springboot

Wake up Wake up Wake up
Sleep Sleep Sleep Zzzzzzzzzzzzz

策略模式在Spring中的优化完成。app

相关文章
相关标签/搜索