目录
前言
工作前几年,个人觉得掌握相关的设计模式来简化工作很重要。
策略模式
根据不同的策略执行不同的业务逻辑
参考文章
这里 ,其实我们项目里面也有相关应用
基本思路都是,有个抽象的类,包括执行方法,然后一个type来设计不同的策略,一个map来保存不同策略对应不同执行方案,方案是实现抽象类的各种类
详细讲解
抽象实践类
public abstract class InspectionSolver {
public abstract void doSomeThing(int i);
public abstract String getType();
}
doSomeThing处理不同的业务逻辑
getType进行设置不同的type,或者像上面图一样每新增一个就得在init进行设置map
实现不同策略
@Component
public class AInspectionSolver extends InspectionSolver{
@Override
public void doSomeThing(int i) {
System.out.println("A调用"+i);
}
@Override
public String getType() {
return "A";
}
}
@Component
public class BInspectionSolver extends InspectionSolver{
@Override
public void doSomeThing(int i) {
System.out.println("B调用"+i);
}
@Override
public String getType() {
return "B";
}
}
重点:业务容器
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;
/**
* Created on 2019/9/2.
*
* @author yangsen
*/
@Component
public class InspectionSolverChooser implements ApplicationContextAware {
private ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.context = applicationContext;
}
private Map<String, InspectionSolver> chooseMap = new HashMap<>();
public InspectionSolver choose(String type) {
return chooseMap.get(type);
}
@PostConstruct
public void register() {
Map<String, InspectionSolver> solverMap = context.getBeansOfType(InspectionSolver.class);
for (InspectionSolver solver : solverMap.values()) {
chooseMap.put(solver.getType(), solver);
}
}
}
可以看到和图一样,采用@PostConstruct在类初始化前就行init,配置map
这里使用applicationContextAware获取ApplicationContext,调用context.getBeansOfType来获取所有某一类的所有bean,这样设计会更美观配置map
测试类
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
@Autowired
private InspectionSolverChooser chooser;
@Test
public void contextLoads() {
//准备数据
String taskType = "A";
//获取任务类型对应的solver
InspectionSolver solver = chooser.choose(taskType);
if (solver == null) {
throw new RuntimeException("任务类型暂时无法处理!");
}
//调用不同solver的方法进行处理
solver.doSomeThing(100);
}
}
获取不同策略下的抽象类,执行不同的业务