设计模式笔记—责任链模式

责任链定义

      使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
      使用场景
        多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。
         在请求处理者不明确的情况下向多个对象中的一个提交一个请求。
         需要动态指定一组对象处理请求。
举例:报账申请
//抽象领导者
public abstract class Leader {
	//上一级领导处理者
	protected Leader nextHandler;
	//处理报账请求  money:能批复的报账额度
	public final void handleRequest(int money){
		if(money<=limit()){
			handle(money);
		}else{
			if(null!=nextHandler)
				nextHandler.handleRequest(money);;
		}
	}
	//自身能批复的额度权限
	public abstract int limit();
	//处理报账行为
	public abstract  void handle(int money);
}
public class GroupLeader extends Leader{
	@Override
	public int limit() {
		return 100;
	}
	@Override
	public void handle(int money) {
		System.out.println("组长批复报销"+money+"元");
	}
}
public class Director extends Leader{
	@Override
	public int limit() {
		return 5000;
	}
	@Override
	public void handle(int money) {
		System.out.println("主管批复报销"+money+"元");
	}
}
public class Manager extends Leader{
	@Override
	public int limit() {
		return 10000;
	}
	@Override
	public void handle(int money) {
		System.out.println("经理批复报销"+money+"元");
	}
}
public class Boss extends Leader{
	@Override
	public int limit() {
		return Integer.MAX_VALUE;
	}
	@Override
	public void handle(int money) {
		System.out.println("老板批复报销"+money+"元");
	}
}
测试:
public class Worker {
public static void main(String[] args) {
	GroupLeader groupLeader = new GroupLeader();
	Director director = new Director();
	Manager manager = new Manager();
	Boss boss = new Boss();
	//设置上一级领导处理者对象
	groupLeader.nextHandler=director;
	director.nextHandler=manager;
	manager.nextHandler=boss;
	//发起报账申请
	groupLeader.handleRequest(60000);;
}
}
结果:
老板批复报销60000元
分析:由于报账金额比较大,最后有老板来处理。需要注意的是在责任链模式中一个请求发送到链中后,前一节点消费部分消息,然后由后续节点继续处理,最终可以有处理结果也可以没有处理结果。

       优缺点

        优点:将请求和处理分开。提高系统的灵活性。
        缺点:1)性能问题,每个请求都是从链头遍历到链尾,如果链比较长,性能需要关注。2)调试不方便,由于采用类似递归的方式,调试的时候逻辑可能比较复杂。





        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值