闲话
我今天一定要把设计模式看完!!!欢迎大家一起讨论
基本要点
1、定义:将能够处理同一请求的对象连成一条链,所提交的请求沿着链传递,链上的对象判断是否有能力处理该请求,如果能处理则处理,否则传给链上的下一个对象
例如:公司请假申请,假如小于3天,组长审批,大于等于3天小于10天,经理审批,大于等于10天小于30天,总经理审批,大于等于30天不予审批
2、实现方式:
链表方式定义职责链:handler一环接一环
非链表方式实现职责链:通过集合、数组实现责任链,将handler全都放进容器中,使用@order进行迭代与判断
3、使用场景
Java的异常处理机制,try/catch
servlet过滤器的链式处理
实现代码
首先我们需要定义一个审批相关的抽象类,然后再通过继承扩展出相应的审批环节
/**
* 抽象类
*/
public abstract class Leader {
/**
* 当前环节审批人姓名
*/
protected String name;
/**
* 下一环节审批人信息
*/
protected Leader nextLeader;
public Leader(String name) {
this.name = name;
}
public void setNextLeader(Leader nextLeader) {
this.nextLeader = nextLeader;
}
public abstract void handleRequest(LeaveRequest request);
}
/**
* 主任审批环节
*/
public class Director extends Leader{
public Director(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest request) {
// 如果是3天以下,那么组长审批即可
if (request.getDays() < 3) {
System.out.println("当前申请人:" + request.getName() + "请假天数:" + request.getDays() + "请假理由:" + request.getLeaveReason());
System.out.println("主任环节审批通过,处理人:" + this.name);
} else {
// 如果下一审批环节处理人不为空,那么我们就调用下一审批
if (null != this.nextLeader) {
this.nextLeader.handleRequest(request);
}
}
}
}
/**
* 经理审批环节
*/
public class Manager extends Leader{
public Manager(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest request) {
// 如果是10天以下,那么经理审批即可
if (request.getDays() < 10) {
System.out.println("当前申请人:" + request.getName() + "请假天数:" + request.getDays() + "请假理由:" + request.getLeaveReason());
System.out.println("经理环节审批通过,处理人:" + this.name);
} else {
// 如果下一审批环节处理人不为空,那么我们就调用下一审批
if (null != this.nextLeader) {
this.nextLeader.handleRequest(request);
}
}
}
}
/**
* 总经理审批环节
*/
public class GeneralManager extends Leader{
public GeneralManager(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest request) {
// 如果是30天以下,那么总经理审批
if (request.getDays() < 30) {
System.out.println("当前申请人:" + request.getName() + "请假天数:" + request.getDays() + "请假理由:" + request.getLeaveReason());
System.out.println("总经理环节审批通过,处理人:" + this.name);
} else {
// 超过三十天,不予批准
System.out.println("时间太长,不予批准");
}
}
}
在客户端调用时,我们声明责任链即可
public class Client {
public static void main(String[] args) {
// 初始化各个审批环节
Leader a = new Director("马云");
Leader b = new Manager("马化腾");
Leader c = new GeneralManager("任正非");
// 设置责任链对象关系,如果要新增环节,那么上方新增对象,并在此处将其加入责任链即可,无需改动原代码逻辑
a.setNextLeader(b);
b.setNextLeader(c);
LeaveRequest request = new LeaveRequest("Tom", 10, "LOL上分");
a.handleRequest(request);
}
}
如有错误,欢迎指正
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136810.html