根据不同类型/模式,做某件事情,都可以用策略模式
1、定义枚举
/**
* 干部提醒类型
*/
@Getter
public enum RemindType
{
FORMAL("0", "formal", "转正提醒"),
DEMOBILIZED("1", "demobilized", "离岗退养提醒"),
RETIRE("2", "retire", "退休提醒"),
REMOVAL("3", "removal", "到龄免职提醒");
private final String code;
private final String name;
private final String info;
RemindType(String code, String name, String info)
{
this.code = code;
this.name = name;
this.info = info;
}
}
2、定义注解
/**
* 提醒策略注解
*/
@Documented
@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface RedmindTypeHandler {
RemindType value();
}
3、定义接口
/**
* 干部提醒Service接口
*/
public interface ICadreRemindQueryService<T> {
List<CadreUser> selectCadreUserList(CadreUser cadreUser);
}
4、四个实现类
/**
* @Author: Jeffery
* @License: (C) Copyright 2021, trinitytech Corporation Limited.
* @Contact: anson.zhifu@gmail.com
* @Date: 2022/6/22 16:12
* @Version: 1.0
* @Description: 离岗退养
*/
@Slf4j
@Service
@RedmindTypeHandler(RemindType.DEMOBILIZED)
public class CadreRemindDemobilizedServiceImpl implements ICadreRemindQueryService<T> {
@Override
public List<CadreUser> selectCadreUserList(CadreUser cadreUser) {
log.info("CadreRemindDemobilizedServiceImpl");
return null;
}
}
/**
* @Author: Jeffery
* @License: (C) Copyright 2021, trinitytech Corporation Limited.
* @Contact: anson.zhifu@gmail.com
* @Date: 2022/6/22 16:12
* @Version: 1.0
* @Description: 转正提醒
*/
@Slf4j
@Service
@RedmindTypeHandler(RemindType.FORMAL)
public class CadreRemindFormalServiceImpl implements ICadreRemindQueryService<T> {
@Override
public List<CadreUser> selectCadreUserList(CadreUser cadreUser) {
log.info("CadreRemindFormalServiceImpl");
return null;
}
}
/**
* @Author: Jeffery
* @License: (C) Copyright 2021, trinitytech Corporation Limited.
* @Contact: anson.zhifu@gmail.com
* @Date: 2022/6/22 16:12
* @Version: 1.0
* @Description: 到龄免职
*/
@Slf4j
@Service
@RedmindTypeHandler(RemindType.REMOVAL)
public class CadreRemindRemovalServiceImpl implements ICadreRemindQueryService<T> {
@Override
public List<CadreUser> selectCadreUserList(CadreUser cadreUser) {
log.info("CadreRemindRemovalServiceImpl");
return null;
}
}
/**
* @Author: Jeffery
* @License: (C) Copyright 2021, trinitytech Corporation Limited.
* @Contact: anson.zhifu@gmail.com
* @Date: 2022/6/22 16:12
* @Version: 1.0
* @Description: 退休提醒
*/
@Slf4j
@Service
@RedmindTypeHandler(RemindType.RETIRE)
public class CadreRemindRetireServiceImpl implements ICadreRemindQueryService<T> {
@Override
public List<CadreUser> selectCadreUserList(CadreUser cadreUser) {
log.info("CadreRemindRetireServiceImpl");
return null;
}
}
5、策略容器
/**
* @Author: Jeffery
* @License: (C) Copyright 2021, trinitytech Corporation Limited.
* @Contact: anson.zhifu@gmail.com
* @Date: 2022/6/23 15:37
* @Version: 1.0
* @Description: 策略容器
*/
@Slf4j
@Component
public class CadreRemindServiceContext<T> {
private Map<String, T> handlerMap = new HashMap<>();
@Autowired
private ApplicationContext applicationContext;
public T getCadreRemindService(String name) {
return handlerMap.get(name);
}
@PostConstruct
public void init() {
Map<String, Object> beans = applicationContext.getBeansWithAnnotation(RedmindTypeHandler.class);
beans.forEach((name, bean) -> {
RedmindTypeHandler redmindTypeHandler = bean.getClass().getAnnotation(RedmindTypeHandler.class);
log.info("name:{}, bean.name:{}", name, redmindTypeHandler.value().getName());
handlerMap.put(redmindTypeHandler.value().getName(), (T) bean);
});
handlerMap.forEach((key, value) -> {
log.info("key:{}", key);
});
}
}
6、Controller使用
/**
* 干部提醒Controller
*/
@Slf4j
@RestController
@RequestMapping("/remind")
public class CadreRemindController extends BaseController
{
@Autowired
private CadreRemindServiceContext<ICadreRemindQueryService> cadreRemindServiceContext;
/**
* 根据不同策略查询
*/
@PreAuthorize("@ss.hasPermi('management:user:query')")
@Log(title = "根据不同策略查询", businessType = BusinessType.INSERT)
@GetMapping("/{remindType}")
public AjaxResult query(@PathVariable RemindType remindType) {
log.info("remindType:{}", remindType.getInfo());
ICadreRemindQueryService cadreRemindService = cadreRemindServiceContext.getCadreRemindService(remindType.getName());
return AjaxResult.success(cadreRemindService.selectCadreUserList(CadreUser.builder().build()));
}
}