1.定义规范 也可使用抽象类
public interface ITrafficStrategy {
/**
* 获取交通工具类型
*
* @return 结果
*/
String getType();
/**
* 具体交通类型对应的处理方法
*
* @param param 参数
*/
void execute(Object param);
}
2.定义具体策略
@Component
@Slf4j
public class DefaultTrafficStrategy implements ITrafficStrategy{
@Override
public String getType() {
return "Default";
}
@Override
public void execute(Object param) {
log.info("默认交通策略方案");
}
}
@Component
@Slf4j
public class CarStrategy implements ITrafficStrategy{
@Override
public String getType() {
return "Car";
}
@Override
public void execute(Object param) {
log.info("乘坐汽车的策略方案");
}
}
@Component
@Slf4j
public class RailWayStrategy implements ITrafficStrategy{
@Override
public String getType() {
return "RailWay";
}
@Override
public void execute(Object param) {
log.info("乘坐轨道交通的策略方案");
}
}
3.组装策略
@Component
public class TrafficStrategyContext implements ApplicationContextAware {
/**
* 保存所有的策略
*/
private final Map<String, ITrafficStrategy> trafficStrategyMap = new ConcurrentHashMap<>(16);
/**
* 组装策略
*
* @param applicationContext 应用上下文
* @throws BeansException 异常
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Map<String, ITrafficStrategy> strategyMap = applicationContext.getBeansOfType(ITrafficStrategy.class);
strategyMap.values().forEach(iTrafficStrategy ->
trafficStrategyMap.put(iTrafficStrategy.getType(), iTrafficStrategy));
}
/**
* 执行策略
*
* @param type 类型
* @param param 参数
*/
public void executeStrategy(String type, Object param) {
if (!trafficStrategyMap.containsKey(type)) {
// 执行默认策略
ITrafficStrategy defaultStrategy = trafficStrategyMap.get("Default");
defaultStrategy.execute(param);
} else {
ITrafficStrategy trafficStrategy = trafficStrategyMap.get(type);
trafficStrategy.execute(param);
}
}
}
4.使用
@SpringBootTest
@RunWith(SpringRunner.class)
@Slf4j
public class StrategyTest {
@Resource
private TrafficStrategyContext context;
@Test
public void test() {
context.executeStrategy("Car", new Object());
context.executeStrategy("1", new Object());
}
}