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

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

该最佳实践本身就是一种对 责任链模式的增强,模板模式通过 父类 强耦合,预定义好 责任链 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);
    }
}
相关推荐
syt_10131 天前
设计模式之-代理模式
设计模式·代理模式
拾忆,想起1 天前
设计模式:软件开发的可复用武功秘籍
开发语言·python·算法·微服务·设计模式·性能优化·服务发现
老朱佩琪!1 天前
Unity桥接模式
unity·设计模式·c#·桥接模式
小明的小名叫小明1 天前
Solidity入门(10)-智能合约设计模式1
设计模式·区块链·智能合约
小明的小名叫小明1 天前
Solidity入门(11)-智能合约设计模式2
设计模式·区块链·智能合约
__万波__1 天前
二十三种设计模式(十四)--命令模式
java·设计模式·命令模式
程序员zgh1 天前
C++常用设计模式
c语言·数据结构·c++·设计模式
山风wind1 天前
设计模式-模板方法模式详解
python·设计模式·模板方法模式
郝学胜-神的一滴1 天前
Linux线程的共享资源与非共享资源详解
linux·服务器·开发语言·c++·程序人生·设计模式