职责链模式(chain of responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止(有点想链表结构 每个对象和下一个对象相关联)
1、链表方式:比如请假审批(要一级一级的审批)
2、非链表方式:通过集合,数组生成责任链更加实用,将链表上的各个对象都添加到集合中,然后通过反射给构建出来。
然后在容器里一个个的处理。(也就是说把测试代码中除了请假的其他代码都给用一个类来处理)
1、Java的异常机制就是一个责任链模式,一个try可以对应多个catch。如果某一个catch不匹配,则跳到下一个catch中
2、JavaScript语言中的事件的冒泡和捕获机制
3、Servlet开发中,过滤器的链式处理(doFilter())
4、Struts2中,拦截器的调用也是典型的责任链模式
责任链的好处:
1、接受者和发送者都没有对方的明确信息,且链中的对象也并不知道链的结构,结果是责任链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选继承者,大大的降低了耦合度。
请求者不用管具体哪个对象会处理,反正该请求肯定会被处理就行了
2、可以随时增加或者修改处理一个请求的结构,增加了给对象指派职责的灵活性
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("小明", 3, "旅游");
a.handleRequest(request);//小明提交了请假申请给主任
}
/**
* 抽象类:管理责任链上的对象处理的抽象类
* @author guk
*
*/
public abstract class Leader {
protected String name;
protected Leader nextLeader;//下一个继承者
public Leader(String name) {
super();
this.name = name;
}
// 设置责任链上的下一个继承者
public void setNextLeader(Leader nextLeader) {
this.nextLeader = nextLeader;
}
//处理请求的抽象方法
public abstract void handleRequest(LeaveRequest leavePeople);
}
/**
* 主任类
* @author guk
*
*/
public class Director extends Leader {
public Director(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest leavePeople) {
if (leavePeople.getDayCount() <= 3) {
System.out.println("请假人:" + leavePeople.getName() + ",天数:" + leavePeople.getDayCount() + ",理由:" + leavePeople.getRemarks());
System.out.println("审批人:" + this.name + " 主任,审批通过!");
}else {
if (this.nextLeader != null) {
//让下一个继承者来处理这个问题
this.nextLeader.handleRequest(leavePeople);
}
}
}
}
/**
* 经理
* @author guk
*
*/
public class Manager extends Leader {
public Manager(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest leader) {
if (leader.getDayCount() <= 10) {
System.out.println("请假人:" + leader.getName() + ",天数:" + leader.getDayCount() + ",理由:" + leader.getRemarks());
System.out.println("审批人:" + this.name + " 经理,审批通过!");
}else {
if (this.nextLeader != null) {
//让下一个继承者来处理这个问题
this.nextLeader.handleRequest(leader);
}
}
}
}
/**
* 请假的基本信息
* @author guk
*
*/
public class LeaveRequest {
private String name;//请假人
private int dayCount;//请假天数
private String remarks;//请假理由
public LeaveRequest(String name, int dayCount, String remarks) {
this.name = name;
this.dayCount = dayCount;
this.remarks = remarks;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getDayCount() {
return dayCount;
}
public void setDayCount(int dayCount) {
this.dayCount = dayCount;
}
public String getRemarks() {
return remarks;
}
public void setRemarks(String remarks) {
this.remarks = remarks;
}
}