设计模式最佳实践 - 模板模式 + 责任链模式

废话不多说,直接切入正题,本篇要讲的是 模板模式 + 责任链模式 实践。

该最佳实践本身就是一种对 责任链模式的增强,模板模式通过 父类 强耦合,预定义好 责任链 next 方法 的前后一些切面行为,优雅简洁。

先上示例,单独责任链模式 简单示例如下:

java 复制代码
// 请假请求类
class LeaveRequest {
    private String employeeName;
    private int days;

    public LeaveRequest(String employeeName, int days) {
        this.employeeName = employeeName;
        this.days = days;
    }

    public String getEmployeeName() {
        return employeeName;
    }

    public int getDays() {
        return days;
    }
}

// 抽象处理者
abstract class Approver {
    protected Approver nextApprover;

    public Approver(Approver nextApprover) {
        this.nextApprover = nextApprover;
    }

    public abstract void approve(LeaveRequest request);
}

// 具体处理者:组长,处理1-3天的请假
class TeamLeader extends Approver {
    public TeamLeader(Approver nextApprover) {
        super(nextApprover);
    }

    @Override
    public void approve(LeaveRequest request) {
        if (request.getDays() <= 3) {
            System.out.println("组长批准了" + request.getEmployeeName() + "的" + request.getDays() + "天假期");
        } else if (nextApprover != null) {
            nextApprover.approve(request);
        }
    }
}

// 具体处理者:部门经理,处理4-7天的请假
class DepartmentManager extends Approver {
    public DepartmentManager(Approver nextApprover) {
        super(nextApprover);
    }

    @Override
    public void approve(LeaveRequest request) {
        if (request.getDays() > 3 && request.getDays() <= 7) {
            System.out.println("部门经理批准了" + request.getEmployeeName() + "的" + request.getDays() + "天假期");
        } else if (nextApprover != null) {
            nextApprover.approve(request);
        }
    }
}

// 具体处理者:总经理,处理8天及以上的请假
class GeneralManager extends Approver {
    public GeneralManager(Approver nextApprover) {
        super(nextApprover);
    }

    @Override
    public void approve(LeaveRequest request) {
        if (request.getDays() > 7) {
            System.out.println("总经理批准了" + request.getEmployeeName() + "的" + request.getDays() + "天假期");
        } else if (nextApprover != null) {
            nextApprover.approve(request);
        }
    }
}

// 演示类
public class LeaveApprovalDemo {
    public static void main(String[] args) {
        // 构建责任链
        Approver generalManager = new GeneralManager(null);
        Approver departmentManager = new DepartmentManager(generalManager);
        Approver teamLeader = new TeamLeader(departmentManager);

        // 创建请假请求
        LeaveRequest request1 = new LeaveRequest("张三", 2);
        LeaveRequest request2 = new LeaveRequest("李四", 5);
        LeaveRequest request3 = new LeaveRequest("王五", 10);

        // 处理请求
        teamLeader.approve(request1);
        teamLeader.approve(request2);
        teamLeader.approve(request3);
    }
}

当需求增加,每个子类责任链都需要有额外的功能,比如 处理请假请求前,需要 看一下手表,就可以在父类抽取 出方法,子类只需要实现核心逻辑,前后切面逻辑父类通过模板模式预定义,不仅耦合性低,重用性也极高,如需要更改父类前后逻辑,直接进行重写即可,加上模板模式后,示例如下:

java 复制代码
// 请假请求类
class LeaveRequest {
    private String employeeName;
    private int days;
    private String reason;

    public LeaveRequest(String employeeName, int days, String reason) {
        this.employeeName = employeeName;
        this.days = days;
        this.reason = reason;
    }

    public String getEmployeeName() {
        return employeeName;
    }

    public int getDays() {
        return days;
    }

    public String getReason() {
        return reason;
    }
}

// 抽象处理者 - 结合了模板模式
abstract class Approver {
    protected Approver nextApprover;
    protected String approverTitle; // 审批者头衔

    public Approver(String approverTitle, Approver nextApprover) {
        this.approverTitle = approverTitle;
        this.nextApprover = nextApprover;
    }

    // 模板方法:定义审批流程的骨架
    public final void processRequest(LeaveRequest request) {
        // 1. 前置处理
        beforeApproval(request);
        
        // 2. 核心审批逻辑(由子类实现)
        boolean handled = handleApproval(request);
        
        // 3. 后置处理
        afterApproval(request, handled);
        
        // 4. 如果当前处理者不能处理,传递给下一个
        if (!handled && nextApprover != null) {
            nextApprover.processRequest(request);
        }
    }

    // 前置处理 - 模板中的固定步骤
    protected void beforeApproval(LeaveRequest request) {
        System.out.println("\n===== 开始处理 " + request.getEmployeeName() + " 的请假申请 =====");
        System.out.println("请假天数: " + request.getDays() + "天");
        System.out.println("请假原因: " + request.getReason());
        System.out.println("当前审批者: " + approverTitle);
    }

    // 后置处理 - 模板中的固定步骤
    protected void afterApproval(LeaveRequest request, boolean handled) {
        if (handled) {
            System.out.println(approverTitle + "已批准该请假申请");
            System.out.println("===== " + request.getEmployeeName() + " 的请假申请处理完毕 =====");
        } else {
            System.out.println(approverTitle + "无法处理,将提交给上一级审批");
        }
    }

    // 抽象方法:具体审批逻辑由子类实现
    protected abstract boolean handleApproval(LeaveRequest request);
}

// 具体处理者:组长,处理1-3天的请假
class TeamLeader extends Approver {
    public TeamLeader(Approver nextApprover) {
        super("组长", nextApprover);
    }

    @Override
    protected boolean handleApproval(LeaveRequest request) {
        if (request.getDays() <= 3) {
            // 组长特有的审批逻辑
            System.out.println("组长审批:请假天数在权限范围内,直接批准");
            return true;
        }
        return false;
    }
}

// 具体处理者:部门经理,处理4-7天的请假
class DepartmentManager extends Approver {
    public DepartmentManager(Approver nextApprover) {
        super("部门经理", nextApprover);
    }

    @Override
    protected boolean handleApproval(LeaveRequest request) {
        if (request.getDays() > 3 && request.getDays() <= 7) {
            // 部门经理特有的审批逻辑
            System.out.println("部门经理审批:已核实工作安排,可批准请假");
            return true;
        }
        return false;
    }
}

// 具体处理者:总经理,处理8天及以上的请假
class GeneralManager extends Approver {
    public GeneralManager(Approver nextApprover) {
        super("总经理", nextApprover);
    }

    @Override
    protected boolean handleApproval(LeaveRequest request) {
        if (request.getDays() > 7) {
            // 总经理特有的审批逻辑
            System.out.println("总经理审批:已评估项目进度,批准长假申请");
            return true;
        }
        return false;
    }
}

// 演示类
public class EnhancedLeaveApprovalDemo {
    public static void main(String[] args) {
        // 构建责任链
        Approver generalManager = new GeneralManager(null);
        Approver departmentManager = new DepartmentManager(generalManager);
        Approver teamLeader = new TeamLeader(departmentManager);

        // 创建请假请求
        LeaveRequest request1 = new LeaveRequest("张三", 2, "个人身体不适");
        LeaveRequest request2 = new LeaveRequest("李四", 5, "家中有事需要处理");
        LeaveRequest request3 = new LeaveRequest("王五", 10, "计划休年假旅游");

        // 处理请求
        teamLeader.processRequest(request1);
        teamLeader.processRequest(request2);
        teamLeader.processRequest(request3);
    }
}
相关推荐
nnsix11 小时前
设计模式 - 建造者模式 笔记
笔记·设计模式·建造者模式
cui178756812 小时前
矩阵拼团 + 复购拼团:新零售最稳的复购模式,规则简单
大数据·人工智能·设计模式·零售
百珏12 小时前
[灰度发布]:全链路透传组件:APM、自研方案与 Java Agent 的实现取舍
后端·设计模式·架构
likerhood14 小时前
设计模式 · 享元模式(Flyweight Pattern)java
java·设计模式·享元模式
AI大法师14 小时前
从 Adobe 焕新看品牌系统升级:Logo、主色、字体与产品体验如何重新对齐
大数据·人工智能·adobe·设计模式
贵慜_Derek15 小时前
《从零实现 Agent 系统》连载 03|控制循环:感知—决策—行动—反思
人工智能·设计模式·架构
nnsix16 小时前
设计模式 - 原型模式 笔记
笔记·设计模式·原型模式
nnsix16 小时前
设计模式 - 适配器模式 笔记
笔记·设计模式·适配器模式
asdfg125896316 小时前
一文理解软件开发中的“设计模式”
java·设计模式·软件开发
云飞云共享云桌面17 小时前
SolidWorks 服务器通过云飞云共享云桌面10人研发共享方案
运维·服务器·3d·设计模式·电脑