前言
策略模式是一种行为设计模式,它允许你定义一系列算法,将每个算法封装起来,并使它们可以互相替换。以下是使用策略模式的一些优点和适用场景:
优点:
-
灵活性和可维护性: 策略模式使得算法的变化独立于使用算法的客户端。新增、删除或修改算法不会影响到客户端的代码,从而提高了系统的灵活性和可维护性。
-
可复用性: 策略模式将每个算法封装成独立的类,这使得这些算法可以在不同的场景中被复用。客户端可以选择使用不同的策略,而无需修改现有代码。
-
易于扩展: 可以通过添加新的策略类来扩展系统的行为,而不需要修改已有的代码。这符合开闭原则。
-
减少条件语句: 策略模式可以减少大量的条件语句。相比于使用多个
if-else
语句,通过策略模式可以使得代码更加清晰、简洁。
适用场景:
-
有多个相关的类,只是行为有差异: 当有多个类具有相似的行为,但其实现不同的算法时,策略模式可以将这些算法封装到独立的策略类中,使得代码更加模块化。
-
需要在运行时动态选择算法: 当需要在运行时根据某些条件来选择不同的算法时,策略模式可以让你在运行时切换策略,而无需修改代码。
-
类中包含大量的条件语句: 当一个类中包含大量的条件语句,而且这些条件语句根据不同的条件执行不同的操作时,可以考虑使用策略模式来替代条件语句,使得代码更加清晰、易于维护。
总体来说,策略模式是一种有助于降低耦合度、提高代码灵活性和可维护性的设计模式,特别适用于需要在运行时动态选择算法的情景。
实列代码
1.定义策略接口
public interface xxxStrategyService {
void execute(Integer businessId);
}
2.定义策略实现类
public class xxxAServiceImpl implements xxxStrategyService {
@Override
public void execute(Integer businessId) {
System.out.println("这是xxx==A==的实现............"+businessId);
}
}
public class xxxBServiceImpl implements xxxStrategyService {
@Override
public void execute(Integer businessId) {
System.out.println("这是xxx==B==的实现............" + businessId);
}
}
3.调用策略的类
public class xxxStrategyContext {
private xxxStrategyService strategy;
public void setStrategy(xxxStrategyService strategy) {
this.strategy = strategy;
}
public void executeOperation(Integer businessId) {
strategy.execute(businessId);
}
}
4.选择策略的类
根据传参businessType决定使用哪一个策略
businessId作为业务处理的id(可以不加)
public class xxxSelectStrategy {
public static void selectStrategy(Integer businessType,Integer businessId){
xxxStrategyContext context = new xxxStrategyContext();
switch (businessType) {
case 1:
context.setStrategy(new xxxAServiceImpl());
break;
case 2:
context.setStrategy(new xxxBServiceImpl());
break;
default:
throw new IllegalArgumentException("Unsupported businessType: " + businessType);
}
context.executeOperation(businessId);
}
}
5.实际业务中使用策略
public static void main(String[] args) {
DocusignSelectStrategy.selectStrategy(1,111);
DocusignSelectStrategy.selectStrategy(2,222);
}
输出结果: