职责链模式

1. 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

2. 示例: 以公司请假审批为例,审批需要部门经理、总监、老板依次审批,最终审批人由实际请假天数而定。

/**
 * @author beck.yang
 * @date 2022/7/5 16:26
 * @description
 */
public class Request {
	private String type;
	private int number;
	private String name;

	public Request(String type, int number, String name) {
		this.type = type;
		this.number = number;
		this.name = name;
	}

	public String getType() {
		return type;
	}

	public int getNumber() {
		return number;
	}

	public String getName() {
		return name;
	}
}
/**
 * @author beck.yang
 * @date 2022/7/5 15:51
 * @description
 */
public abstract class Manager {
	protected String name;
	// 上级
	protected  Manager superManager;

	public Manager(String name){
		this.name = name;
	}

	public void setSuperManager(Manager superManager) {
		this.superManager = superManager;
	}

	public abstract void checkRequest(Request request);
}
/**
 * @author beck.yang
 * @date 2022/7/5 16:31
 * @description 部门经理
 */
public class DepartmentManager extends Manager {
	public DepartmentManager(String name) {
		super(name);
	}

	@Override
	public void checkRequest(Request request) {
		if ("请假".equals(request.getType()) && request.getNumber() <= 3) {
			System.out.println(String.format("%s批准%s%s%d天", name, request.getName(), request.getType(), request.getNumber()));
		} else {
			if (superManager != null) {
				superManager.checkRequest(request);
			}
		}
	}
}
/**
 * @author beck.yang
 * @date 2022/7/5 16:31
 * @description 总监
 */
public class Director extends Manager {
	public Director(String name) {
		super(name);
	}

	@Override
	public void checkRequest(Request request) {
		if ("请假".equals(request.getType()) && request.getNumber() <= 5) {
			System.out.println(String.format("%s批准%s%s%d天", name, request.getName(), request.getType(), request.getNumber()));
		} else {
			if (superManager != null) {
				superManager.checkRequest(request);
			}
		}
	}
}
/**
 * @author beck.yang
 * @date 2022/7/5 16:39
 * @description 老板
 */
public class Boss extends Manager{
	public Boss(String name) {
		super(name);
	}

	@Override
	public void checkRequest(Request request) {
		if ("请假".equals(request.getType()) && request.getNumber() <= 10) {
			System.out.println(String.format("%s批准%s%s%d天", name, request.getName(), request.getType(), request.getNumber()));
		} else {
			// 老板需要处理全部
			System.out.println(String.format("%s拒绝%s%s%d天", name, request.getName(), request.getType(), request.getNumber()));
		}
	}
}
/**
 * @author beck.yang
 * @date 2022/7/5 15:51
 * @description 责任链模式
 */
public class Main {
	public static void main(String[] args) {
		DepartmentManager departmentManager = new DepartmentManager("部门经理");
		Director director = new Director("总监");
		Boss boss = new Boss("大老板");
		departmentManager.setSuperManager(director);
		director.setSuperManager(boss);

		Request request = new Request("请假",3,"张三");
		departmentManager.checkRequest(request);

		Request request2 = new Request("请假",4,"张三");
		departmentManager.checkRequest(request2);

		Request request3 = new Request("请假",8,"张三");
		departmentManager.checkRequest(request3);

		Request request4 = new Request("请假",12,"张三");
		departmentManager.checkRequest(request4);
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值