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

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

该最佳实践本身就是一种对 责任链模式的增强,模板模式通过 父类 强耦合,预定义好 责任链 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);
    }
}
相关推荐
咖啡八杯2 小时前
GoF设计模式——模板方法模式
java·后端·spring·设计模式
饼干哥哥12 小时前
Openclaw已死?任何Agent都能用Cli实现AI自主运营跨境电商
设计模式·openai·ai编程
折哥的程序人生 · 物流技术专研14 小时前
第4篇:抽象工厂模式——产品族一键创建
java·设计模式·抽象工厂模式·创建型模式·编程进阶·产品族·扩充系列
geovindu1 天前
go: Cascading Failures Pattern
开发语言·后端·设计模式·golang·反模式·级联失效反模式
端庄的战斗机1 天前
javascript 设计模式(文章很长,请自备瓜子,水果和眼药水)
开发语言·javascript·设计模式
饼干哥哥1 天前
我开发了一个「吃掉」别人Skill来升级的饕餮.Skill,现在免费开源
人工智能·设计模式·开源
CaffeinePro1 天前
什么是系统架构?架构师到底在做什么?
设计模式·架构
AI人工智能+电脑小能手2 天前
【大白话说Java面试题 第156题】【06_Spring篇】第16题:Spring 用到了哪些设计模式?
java·spring·设计模式·代理模式·工厂模式
前端百草阁2 天前
JavaScript 设计模式(23 种)
开发语言·前端·javascript·设计模式
geovindu2 天前
java: Singleton Pattern
java·开发语言·后端·单例模式·设计模式·创建型模式