1 问题背景
2个月之前粗略了解了各种设计模式,今天使用责任链设计模式+工厂模式简单地实现批假流程。
2 需求
3 实现
设计模式的思想就是面向接口编程,因此第一步先设计关于处理批假的申请
public interface VacationHandler {
/**
* 处理请假
* @param day
*/
void handleApply(Integer day);
/**
* 处理事情
* @param day
*/
void handle(Integer day);
}
设计抽象模板类,统一方法的入口出口,公共方法的细节由抽象类实现,特性方法交由抽象模板类实现
public abstract class AbstractVacationHandler implements VacationHandler {
private VacationHandler nextHandler;
public VacationHandler getNextHandler() {
return this.nextHandler;
}
public void setNextHandler(VacationHandler nextHandler) {
this.nextHandler = nextHandler;
}
@Override
public void handle(Integer day) {
handleApply(day);
if (nextHandler != null) {
nextHandler.handle(day);
}
}
}
各个实现类,分别是组长、部长、经理
组长:
@Slf4j
public class GrouperVacationHandler extends AbstractVacationHandler{
@Override
public void handleApply(Integer day) {
if (Objects.nonNull(day)) {
log.info("组长批准请假{}天", day);
}
}
}
部长:
@Slf4j
public class DepartmenterVacationHandler extends AbstractVacationHandler{
@Override
public void handleApply(Integer day) {
if (Objects.nonNull(day) && day > 3) {
log.info("部长批准请假{}天", day);
}
}
}
经理:
@Slf4j
public class ManagerVacationHandler extends AbstractVacationHandler {
@Override
public void handleApply(Integer day) {
if (Objects.nonNull(day) && day > 5) {
log.info("经理批准请假{}天", day);
}
}
}
创建请假处理类
/**
* 定制VacationHandler的工厂方法
* @return
*/
public static VacationHandler createVacationHandler() {
GrouperVacationHandler grouper = new GrouperVacationHandler();
DepartmenterVacationHandler departmenter = new DepartmenterVacationHandler();
ManagerVacationHandler manager = new ManagerVacationHandler();
grouper.setNextHandler(departmenter);
departmenter.setNextHandler(manager);
return grouper;
}
测试:
public static void main(String[] args) {
SpringApplication.run(GmallDesignChainApplication.class, args);
VacationHandler vacationHandler = VacationHandlerFactory.createVacationHandler();
for (int i = 1; i < 9; i = i+3) {
vacationHandler.handle(i);
}
}
结果