


























在职责链模式中通常每个接收者都包含另一个接收者的引用,这样在处理请求时,如果自己无法处理该请求时就会把请求,传递给下一个接收者,依次类推直到最后。
通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
类似的:
意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。
例: 日志框架, 一个日志记录对象只处理自己等级的日志, 这时候可以把所有等级的日志记录器串联起来, 组成责任链, 统一接受记录所有等级的日志记录请求;

(所有等级日志记录器, 继承自它)
abstract class AbsLoger{
public final static int INFO = 1;
public final static int DEBUG = 2;
public final static int ERROR = 3;
int leve;
//下一个处理对象
AbsLoger nextLoger;
public void setNextChina( AbsLoger nextLoger){
this.nextLoger = nextLoger;
}
public void logMes(int leve, String mes){
//处理自己等级的
if (this.leve == leve){
write(mes);
}
//调用下一个处理对象
if(this.nextLoger != null){
nextLoger.logMes(leve, mes);
}
}
//具体处理的方法, 交给实现类
abstract void write(String mes);
}
//实现记录器(error 等级)
class ErrorLoger extends AbsLoger{
ErrorLoger(){
this.leve=AbsLoger.ERROR;
}
@Override
void write(String mes) {
System.out.println("这是处理错误级别的: "+ mes);
}
}
//实现记录器(info 等级)
class InfoLoger extends AbsLoger{
InfoLoger(){
this.leve=AbsLoger.INFO;
}
@Override
void write(String mes) {
System.out.println("这是处理信息级别的: "+ mes);
}
}
//实现记录器(debug 等级)
class DebugLoger extends AbsLoger{
DebugLoger(){
this.leve=AbsLoger.DEBUG;
}
@Override
void write(String mes) {
System.out.println("这是处理调试级别的: "+ mes);
}
}
测试
/**
* 组成责任链
*/
public static AbsLoger getChinaLoger(){
AbsLoger errorLoger = new ErrorLoger();
AbsLoger infoLoger = new InfoLoger();
AbsLoger debugLoger = new DebugLoger();
//组成责任链
errorLoger.setNextChina(infoLoger);
infoLoger.setNextChina(debugLoger);
//注意 (就是一个单向链表, 所以要返回链头) 也就是 errorLoger
return errorLoger;
}
public static void main(String[] args) {
AbsLoger loger = ChainOfResponsibilityPattern.getChinaLoger();
loger.logMes(AbsLoger.DEBUG, "调试日志");
loger.logMes(AbsLoger.INFO, "信息日志");
loger.logMes(AbsLoger.ERROR, "错误日志");
}
职责链模式的优点
降低了对象之间的耦合度
该模式降低了请求发送者和接收者的耦合度。
增强了系统的可扩展性
可以根据需要增加新的请求处理类,满足开闭原则。
增强了给对象指派职责的灵活性
当工作流程发生变化,可以动态地改变链内的成员或者修改它们的次序,也可动态地新增或者删除责任。
责任链简化了对象之间的连接
一个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句。
责任分担
每个类只需要处理自己该处理的工作,不能处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。
职责链模式的缺点:
责任链模式常见的使用场景有以下几种情况。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。