您的位置:首页 > 其它

责任链模式

2011-08-13 11:15 232 查看
今天学习了下责任链模式,对责任链模式有了一个初步的了解,这个模式有些复杂

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

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

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

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

抽象处理者类

Java代码







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

具体处理者

Java代码







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,我有权利处理");
};
}

……

角色抽象类

Java代码







package com.gengu.责任链;

/**
* 角色抽象类
* */
public abstract class Roler {

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

}

具体角色类

Java代码







package com.gengu.责任链;

/**
* 角色抽象类
* */
public class RolerA extends Roler{

public RolerA(){
super(1);
}
}

package com.gengu.责任链;

/**
* 角色抽象类
* */
public class RolerB extends Roler{

public RolerB(){
super(2);
}
}

测试类

Java代码







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

}
}

责任链模式的优点是,能将请求和处理分开请求者不用直到是谁处理的,处理者可以不用直到请求的全貌,两者解耦。但它的缺点是性能问题很大,每一个请求都要从链头遍历到链尾。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: