设计模式之 Chain of Responsibility(职责链)通俗理解

1 Chain of Responsibility 定义


Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递 request. 也就是说,来了一个请求,A 类先处理,如果没有处理,就传递到 B 类处理,如果没有处理,就传递到 C 类处理,就这样象一个链条(chain)一样传递下去。

2 如何使用?

1 异常处理try catch就是CoR模式

2 举例:小新请假,找领导批示;请假超过3天主任批示,超过3天小于10天总经理批示;也是CoR模式。

package xx.study.design.cor;

/**
 * 请假的基本信息
 *
 */
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;
    }


}
package xx.study.design.cor;

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);

}
package xx.study.design.cor;

/**
 * 主任类
 *
 */
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);
            }
        }
    }

}
package xx.study.design.cor;

/**
 * 经理
 *
 */
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);
            }
        }
    }

}
package xx.study.design.cor;

public class CorDemo {
    public static void main(String[] args) {
        //构建各个领导人
        Leader a = new Director("张三");//主任
        Leader b = new Manager("李四");//总经理

        //设置各个责任链上的关系
        a.setNextLeader(b);//主任的下一个审批人为经理

          //开始请假
        LeaveRequest request = new LeaveRequest("小新", 8, "旅游");
        a.handleRequest(request);//小新提交了请假申请给主任
    }

}

猜你喜欢

转载自blog.csdn.net/h4241778/article/details/107524507
今日推荐