前言
今天在开发过程中遇到一个情况,让我们来简单描述一下:在配置A时,由于A的类型是有多种的,会牵扯到很多子表,就导致了在选择不同的类型时,保存配置的逻辑和表都是不一样的。说到这里,应该大多数人都会想到一个西,就是策略模式,接下来详细介绍一下策略模式
简介
策略模式是一种行为型模式,其核心思想是将定义的一系列算法或行为封装起来,并让它们可以相互替换,从而使得算法的变化独立于使用算法的客户。策略模式通过封装算法来避免客户直接与算法实现耦合,从而提高系统的可维护性、可扩展性和灵活性
类图
废话不多说,直接上代码
示例代码
本示例代码是采用策略模式+工厂模式
- 策略接口
public interface CStrategy {
<T> void save(T t);
}
- 上下文
public class Context {
// 具体策略
private final CStrategy cStrategy;
public Context(CStrategy cStrategy) {
this.cStrategy = cStrategy;
}
public <T> void save(T t) {
cStrategy.save(t);
}
}
- 工厂类
@Component
public class CFactory {
public CStrategy getStrategy(String type) {
switch (type) {
case "a":
return aService;
case "b":
return bService;
case "c":
return cService;
}
}
}
- 三个实现类
@Service
public class AService implements CStrategy{
@Override
public <T> void save(T t){}
}
@Service
public class BService implements CStrategy{
@Override
public <T> void save(T t){}
}
@Service
public class CService implements CStrategy{
@Override
public <T> void save(T t){}
}
- 测试
Context context = new Context(factory.getStrategy("a"));
context.save(user)
适用场景
- 当一个系统需要动态的选择某个算法时
- 当一个对象有多种行为时
支付方式:微信、支付宝、银联、云闪付等等
活动方式:满减、限时折扣、拼团等等
优点
- 省略大量的 if/else 语句
- 代码可读性更强
- 更优雅
- 扩展性更高,更容易维护
可优化
采用enum类对类型进行管理,后续可直接通过enum来创建出对应的具体策略
注:如有任何错误,请大佬指出。希望此篇对您有帮助!
您的点赞是我创作的动力,各位大佬戳戳小赞~~