当前位置: 代码迷 >> 综合 >> 设计模式之职责链模式(chain of responsibility)
  详细解决方案

设计模式之职责链模式(chain of responsibility)

热度:45   发布时间:2023-12-03 13:34:00.0

职责链模式(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;
    }
    
    
}
 

  相关解决方案