本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、定义
策略模式(Strategy Pattern):策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化.
二、优缺点
优点:
1.策略模式符合开闭原则。
2.可以避免使用多重条件判断。例如(if...else...等)
3.使用策略模式可以提高算法的保密性和安全性。
缺点:
1.使用方必须知道所有的策略,并且自行决定使用哪一个策略。
2.代码中会产生大量的策略类,增加维护难度。
三、代码实现
需求:我们有两个数字,要根据传入的type来判断这两个数字应该是相加,还是相减。
1.首先我们定义一个抽象类,或者接口
public interface CalculateService {
void calculateValue(Integer number1, Integer number2);
}
2.接下来我们定义策略的工厂.
@Component
public class CalculateServiceFactory {
@Resource
private Map<String, CalculateService> calculateServiceStrategyMap = new ConcurrentHashMap<>(5);
public CalculateService getCalculateServiceImpl(String type) {
return calculateServiceStrategyMap.get(type);
}
}
3.我们定义不同的实现类,重点在于bean的名字,bean的名字其实就是我们if...else判断的条件
减法的实现类
@Slf4j
@Service("subtraction")
public class subtractionCalculateServiceImpl implements CalculateService {
@Override
public void calculateValue(Integer number1, Integer number2) {
Integer result = number1 - number2;
log.debug("策略模式====>计算类结果为" + result);
}
}
加法的实现类
@Service("addition")
@Slf4j
public class AdditionCalculateServiceImpl implements CalculateService {
@Override
public void calculateValue(Integer number1, Integer number2) {
Integer result = number1 + number2;
log.debug("策略模式====>计算类结果为" + result);
}
}
4.策略模式与传统的if...else的比较
public void calculateTraditionalMethod(String type) {
Integer number1 = 1;
Integer number2 = 2;
if (type == "addition") {
Integer result = number1 + number2;
System.out.print("传统实现====>计算类结果" + result);
} else if (type == "subtraction") {
Integer result = number1 - number2;
System.out.print("传统实现====>计算类结果" + result);
}
}
@Autowired
private CalculateServiceFactory calculateServiceFactory;
//这里直接根据传入的type 去找到对应的bean 所以不需要进行判断
public void calculateStrategyMethod(String type) {
calculateServiceFactory.getCalculateServiceImpl(type);
}
\