继上一篇飞书、企业微信、钉钉如何精准推送入职与生日祝福背后的数据魔法之后,今天在此基础上分享下策略模式。 策略模式是一种行为型设计模式,在工作中使用的频次非常高。
生日祝福,入职周年祝福等,每一种都是一种不同的策略。
不了解背景的人可以先去看看入职周年祝福与生日祝福背后的数据魔法
首先,我们需要定一个抽象的策略类,或者策略接口,它有一个获取员工信息的方法。
public interface Strategy{
List<EmployeeDto> getEmployeeInfo(StrategyTypeEnum strategyTypeEnum);
}
接下来我们分别来看每种策略的实现实现。
员工生日
public BirthdayStrategy implements Strategy{
@Override
public List<EmployeeDto> getEmployeeInfo(StrategyEnum strategyEnum){
// 具体的实现逻辑就不写了,就很简单,重点是通过这个例子来学习策略模式的使用。
// 生日关注的是生日字段(birthday)
return null;
}
}
入职周年
public WorkAnniversaryStrategy implements Strategy{
@Override
public List<EmployeeDto> getEmployeeInfo(StrategyEnum strategyEnum){
// 入职周年这种策略,关注的是入职时间字段
return null;
}
}
有了具体的策略类,我们需要有一个环境类来关联策略,这里我们使用elastic-job来充当环境类,不了解elastic-job的uu们,看这篇Elastic-Job中的cron表达式妙用。当前有新的策略也可以直接扩展。
策略类型枚举
@Getter
public enum StategyTypeEnum{
// 枚举可以增加一些额外的属性,比如周年数据,具体几周年,祝福的有效时间等等,可用于具体逻辑的处理。
BIRTHDAY("birthday", "生日祝福"),
WORK_ANNIVERSARY("work_anniversary", "入职周年祝福");
private final Integer code;
private final String desc;
}
接下来来看环境类即Elastic-Job。
// 可以自定义一个注解,结合cron表达式来定时触发job。
@DefineJobConf(name="birthday-job", cron="")
public BirthdayJob implements SimpleJob{
@Autowired
private Strategy strategy;
// 直接从Bean容器中获取
@Autowird
private ApplicationContext applicationContext;
@Override
public void execute(ShardingContext shardingContext){
// 当然也可以把获取策略的实现类提取成一个公共的方法。
strategy = applicationContext.getBean(BirthdayStrategy.class);
strategy.getEmployeeInfo(BIRTHDAY);
// 获取到数据之后,就可以进行后续的通知了。
}
}
入职周年祝福和生日祝福一样,这样就不在一一罗列了。
最后我们来总结下策略模式都有哪些优点和不足。
优点
- 灵活性高,可扩展性强:可以在运行时动态选择和切换不同的策略,增加了系统的灵活性和可扩展性。
- 代码复用:各种策略类都是独立的,提高了代码的可复用性。
- 遵循开闭原则:对扩展开放,对修改关闭。有新的策略,无需修改原有代码,只要增加新的策略类即可。
不足
- 类的数量增加:随着策略增多,策略类的数量会增多,增加了代码的复杂性。
- 代码的理解难度会提升:环境类引用的是抽象的策略类或者接口,可读性可能没那么高,理解起来相对不是那么容易。