设计模式之责任链模式

设计模式之责任链模式

定义:
将能够处理同一类的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,处理或者传递给链上的下一个对象

场景:
1)公司里请假条的审批:
如果请假人数小于3天,主任审批;
如果请假人数大于等于3天,小于10天,经理审批;
如果请假人数大于等于10天,小于30天,总经理审批;
如果超过30天,拒绝请假
2)公司中报销单据流程
3)学校奖学金的评审

实例:公司请假条审批

LeaveRequest

/**
 * 封装请假的基本信息
 */
package com.chainOfRespon;

public class LeaveRequest {
    private String name;
    private int leaveDays;
    private String reason;
    
    //构造器
    public LeaveRequest(String name, int leaveDays, String reason) {
    
	    this.name = name;//名字
	    this.leaveDays = leaveDays;//请假天数
	    this.reason = reason;//请假原因
    }
    
    public String getName() {
    	return name;
    }
    
    public void setName(String name) {
    	this.name = name;
    }
    
    public int getLeaveDays() {
    	return leaveDays;
    }
    
    public void setLeaveDays(int leaveDays) {
    	this.leaveDays = leaveDays;
    }
    
    public String getReason() {
    	return reason;
    }
    
    public void setReason(String reason) {
    this.reason = reason;
    }
}

Leader

/**
 * 抽象类
 */
package com.chainOfRespon;

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 handleResquest(LeaveRequest request);
}

Director

/**
 * 主任
 */
package com.chainOfRespon;

public class Director extends Leader {

    public Director(String name) {
    	super(name);
    }
    
    //处理请求的核心业务方法
    @Override
    public void handleResquest(LeaveRequest request) {
	    //如果请假天数少于3天,主任审批
	    if(request.getLeaveDays()<3) {
		    System.out.println("请假人:"+request.getName()+" 天数:"+request.getLeaveDays()+" 原因:"+request.getReason());
		    System.out.println("主任"+this.name+"审批通过");
	    }else {
	    //超过3天,下一级领导人审批
	    if(this.nextLeader!=null) {
		    this.nextLeader.handleResquest(request);
		    }
	    }
    }
}

Manager

/**
 * 经理
 */
package com.chainOfRespon;

public class Manager extends Leader {

    public Manager(String name) {
    	super(name);
    }
    
    //处理请求的核心业务方法
    @Override
    public void handleResquest(LeaveRequest request) {
	    //如果请假天数少于10天,经理审批
	    if(request.getLeaveDays()<10) {
		    System.out.println("请假人:"+request.getName()+" 天数:"+request.getLeaveDays()+" 原因:"+request.getReason());
		    System.out.println("经理"+this.name+"审批通过");
	    }else {
	    //超过10天,下一级领导人审批
		    if(this.nextLeader!=null) {
			    this.nextLeader.handleResquest(request);
			}
	    }
    }
}

GenerateManager

/**
 * 总经理
 */
package com.chainOfRespon;

public class GenerateManager extends Leader {

    public GenerateManager(String name) {
    super(name);
    }
    
    //处理请求的核心业务方法
    @Override
    public void handleResquest(LeaveRequest request) {
	    //如果请假天数少于30天,总经理审批
	    if(request.getLeaveDays()<30) {
		    System.out.println("请假人:"+request.getName()+" 天数:"+request.getLeaveDays()+" 原因:"+request.getReason());
		    System.out.println("总经理"+this.name+"审批通过");
	    }else {
	    //超30三天
	    System.out.println("总经理"+this.name+"拒绝"+request.getName()+"请假");
	    }
    }
}

Client

package com.chainOfRespon;

public class Client {
    public static void main(String[] args) {
	    //创建三级领导人
	    Leader director = new Director("张三");
	    Leader manager = new Manager("里斯");
	    Leader generateManager = new GenerateManager("王五");
	    
	    //组织责任链对象关系
	    director.setNextLeader(manager);
	    manager.setNextLeader(generateManager);
	    
	    //创建请假信息
	    LeaveRequest request = new LeaveRequest("小小",10,"回家" );
	    //请假处理
	    director.handleResquest(request);
    }
}

结果

请假人:小小 天数:10 原因:回家
总经理王五审批通过

链表方式定义职责链(上面实例)
非链表方式实现职责链(通过数组、集合生成职责链更加实用)

常见场景:
1)Java中异常机制,一个try可对应多个finally
2)JS中事件的冒泡和捕获机制,Java中事件处理使用的观察者模式
3)Servlet中,过滤器的链式处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值