责任链模式

今天学习了下责任链模式,对责任链模式有了一个初步的了解,这个模式有些复杂

 

比如有这样一种情况:有三个经理,A是负责人事的,B负责财务,C负责销售。他们都能对自己所管辖的领域里大大小小的事情进行处理。但是有一些新入职的职员根本不认识他俩,有的时候一个人事部的人跑去财务部领导那里报告情况,这个时候B就要把请求指引到A那里去,也有的时候B也不知道要找谁,就把请求传递给C,让C处理,C当然也没有权限处理,但是它知道要给A,于是就把请求给了A。

 

这样一层一层的将命令下调,直到找到合适的处理者的行为就是责任链模式。每一个经理都有自己的处理权限,而每一个职员终究只用找到一个经理,但最终是能找到合适的。

 

责任链模式的定义:使得多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该对象,直到所有的对象处理完为止。

 

每一个处理者都有固定的权限,和他的下任处理者。

抽象处理者类

package com.gengu.责任链;


/**抽象处理者*/
public abstract class Handler {

	//可以处理的级别
	private int level;
	//下一个处理者
	private Handler nextHandler;
	
	/**
	 * 每个处理者都必须得请求作出一个响应
	 * 返回一个值 或者打印一条数据
	*/
	public Handler(Handler _nextHandler){
		this.nextHandler = _nextHandler;
	}
	public Handler(int level){
		this.level = level;
	}
	public final void handleMessage(Roler roler){
		//如果权限够  则作出响应
		if(this.level == roler.level){
			this.request();
			//如果有后续的角色 就把请求往下送
		}else if(this.nextHandler != null){
			this.nextHandler.handleMessage(roler);
		}else {
			System.out.println("对不起没有可以处理的角色");
		}		
	}
	
	//对请求作出处理
	public abstract void request();
	
	public void setNextHandler(Handler nextHandler) {
		this.nextHandler = nextHandler;
	}
}

 具体处理者

package com.gengu.责任链;

/**抽象处理者*/
public class HandlerA extends Handler{

	//要设置自己的处理级别
	public HandlerA(){
		super(1);
	}
	@Override
	public void request() {
		System.out.println("我是处理者A,我的处理权限是1,我有权利处理");
	};
}

package com.gengu.责任链;
/**抽象处理者*/
public class HandlerB extends Handler{

	//要设置自己的处理级别
	public HandlerB(){
		super(2);
	}
	@Override
	public void request() {
		System.out.println("我是处理者B,我的处理权限是2,我有权利处理");
	};
}

……

 角色抽象类

package com.gengu.责任链;

/**
 * 角色抽象类
 * */
public abstract class Roler {
	
	protected int level;
	public Roler(int level){
		this . level = level;
	}
	public void doSome(){
		System.out.println("我是角色,我的级别是"+level+"我得做些什么");
	}

}

 具体角色类

package com.gengu.责任链;

/**
 * 角色抽象类
 * */
public class RolerA extends Roler{
	
	public RolerA(){
		super(1);
	}
}

package com.gengu.责任链;

/**
 * 角色抽象类
 * */
public class RolerB extends Roler{
	
	public RolerB(){
		super(2);
	}
}

 测试类

package com.gengu.责任链;

public class Client {

	public static void main(String[] args) {
		Handler handlerA = new HandlerA();
		Handler handlerB = new HandlerB();
		handlerA.setNextHandler(handlerB);
		Roler rolerB = new RolerB();
		handlerA.handleMessage(rolerB);
		
	}
}

 

责任链模式的优点是,能将请求和处理分开请求者不用直到是谁处理的,处理者可以不用直到请求的全貌,两者解耦。但它的缺点是性能问题很大,每一个请求都要从链头遍历到链尾。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值