写点什么

设计模式的艺术 第十六章责任链设计模式练习(提供一个假条审批模块:如果员工请假天数小于 3 天,主任审批该请假条;如果天数大于或等于 3 天,小于 10 天,经理审批;如果天数大于或等于 10 天,小于 30 天,总经理审批;如果超过 30 天,总经理不能审批,提示相应拒绝信息)

作者:代廉洁
  • 2022 年 8 月 30 日
    浙江
  • 本文字数:2047 字

    阅读完需:约 7 分钟

Sunny 软件公司的 OA 系统需要提供一个假条审批模块:如果员工请假天数小于 3 天,主任可以审批该请假条;如果员工请假天数大于或等于 3 天,小于 10 天,经理可以审批;如果员工请假天数大于或等于 10 天,小于 30 天,总经理可以审批;如果超过 30 天,总经理也不能审批,提示相应的拒绝信息。试用职责链模式设计该假条审批模块。

一、类结构图


抽象处理者类:设计为抽象类 Approver,持有一个 Approver 类型的成员 successor 的引用,包含设置后续者具体方法 setSuccessor()、处理审批逻辑的抽象方法 processApproval();

具体处理者类:设计为抽象处理者类的子类,具体实现处理审批逻辑的抽象方法 processApproval();

假条审批请求类:名称为 LeaveApproval,包含请假条的基本信息。

二、典型实现代码

抽象假条审批者类:抽象处理者类
// 抽象假条审批者类:抽象处理者类public abstract class Approvor {    protected Approvor successor;    protected String name;    public Approvor(String name) {        this.name = name;    }
public void setSuccessor(Approvor successor) { this.successor = successor; }
public abstract void processApproval(LeaveApproval leaveApproval);}
复制代码


主任审批者类:具体处理者类
// 主任审批者类:具体处理者类public class Director extends Approvor {
public Director(String name) { super(name); }
@Override public void processApproval(LeaveApproval leaveApproval) { if (leaveApproval.getLeaveDays() < 3) { System.out.println(name + "审批假条:通过"); } else { successor.processApproval(leaveApproval); } }}
复制代码
经理审批者类:具体处理者类
// 经理审批者类:具体处理者类public class Manager extends Approvor {
public Manager(String name) { super(name); }
@Override public void processApproval(LeaveApproval leaveApproval) { if (leaveApproval.getLeaveDays() >= 3 && leaveApproval.getLeaveDays() < 10) { System.out.println(name + "审批假条:通过"); } else { successor.processApproval(leaveApproval); } }}
复制代码
总经理审批者类:具体处理者类
// 总经理审批者类:具体处理者类public class President extends Approvor {
public President(String name) { super(name); }
@Override public void processApproval(LeaveApproval leaveApproval) { if (leaveApproval.getLeaveDays() >= 10 && leaveApproval.getLeaveDays() < 30) { System.out.println(name + "审批假条:通过"); } else { System.out.println("不允许此类假条的审批,已被拒绝"); } }}
复制代码
假条审批请求类:
// 假条审批请求类public class LeaveApproval {    private String name;          // 请假姓名    private Date startDate;       // 请假日期    private Integer leaveDays;    // 请假天数
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Date getStartDate() { return startDate; }
public void setStartDate(Date startDate) { this.startDate = startDate; }
public Integer getLeaveDays() { return leaveDays; }
public void setLeaveDays(Integer leaveDays) { this.leaveDays = leaveDays; }}
复制代码


客户端代码:
public class Client {    public static void main(String[] args) {        Approvor director, manager, president;        director = new Director("主任");        manager = new Manager("经理");        president = new President("总经理");
// 创建责任链 director.setSuccessor(manager); manager.setSuccessor(president);
// 创建请假审批请求 LeaveApproval leaveApproval; leaveApproval = new LeaveApproval(); leaveApproval.setName("张无忌"); leaveApproval.setStartDate(new Date()); leaveApproval.setLeaveDays(1); director.processApproval(leaveApproval);
leaveApproval.setLeaveDays(5); director.processApproval(leaveApproval);
leaveApproval.setLeaveDays(10); director.processApproval(leaveApproval);
leaveApproval.setLeaveDays(30); director.processApproval(leaveApproval); }}
复制代码


编译并运行程序,输出如下结果:
主任审批假条:通过经理审批假条:通过总经理审批假条:通过不允许此类假条的审批,已被拒绝
复制代码


发布于: 刚刚阅读数: 6
用户头像

代廉洁

关注

还未添加个人签名 2019.10.15 加入

还未添加个人简介

评论

发布
暂无评论
设计模式的艺术 第十六章责任链设计模式练习(提供一个假条审批模块:如果员工请假天数小于3天,主任审批该请假条;如果天数大于或等于3天,小于10天,经理审批;如果天数大于或等于10天,小于30天,总经理审批;如果超过30天,总经理不能审批,提示相应拒绝信息)_设计模式的艺术_代廉洁_InfoQ写作社区