责任链模式
将职责逐级划分,层层分离,目的,将耦合的代码解耦,从而提升程序的扩展性,从内存角度出发,节约不必要的开支,提升性能.
责任链模式关键在于,在处理请求的接口处会有一个标记方法,也就是该类自身,进行回调赋值.
如图:
对应该图中,用户发出请求后,服务器接收,对于用户,仅仅知道是将信息发送给了处理中心,而具体谁处理则不需要知道, 用抽象掩盖实体, 提高扩展能力. 自身引用等同于链表结构中的后继
package com.cctv.play;
public abstract class XxxHandler {
/**
* 自身引用 : 后继
*/
protected XxxHandler handler ;
/**
* 提供给相应的子类去调用,指定对应的处理器
* @param handler
*/
public void setHandler(XxxHandler handler) {
this.handler = handler;
}
/**
* 提供抽象方法,对于特定的请求需要具体的子类去实现
* @param str 处理的请求参数
*/
public abstract void execute(String str);
}
各个子类具体实现自身职责
第一个子类实现(伪代码)...
package com.cctv.play;
public class XxxOne extends XxxHandler {
@Override
public void execute(String str) {
if ("职责判断"){
System.out.println("做好本职工作...");
}else{
/**
* 交给后继处理
*/
handler.execute(str);
}
}
}
第二个子类实现(伪代码)...
package com.cctv.play;
public class XxxTwo extends XxxHandler {
@Override
public void execute(String str) {
if ("职责判断"){
System.out.println("做好本职工作...");
}else{
/**
* 交给后继处理
*/
handler.execute(str);
}
}
}
第 N 个子类实现(伪代码)...
package com.cctv.play;
public class XxxXxx extends XxxHandler {
@Override
public void execute(String str) {
if ("职责判断"){
System.out.println("做好本职工作...");
}else{
/**
* 交给后继处理
*/
System.out.println("最高权限进行全部处理");
}
}
}
可以发现, 其上重写的方法均为父类中规定的方法,即职责
配置请求客户端类
package com.cctv.play;
public class ReqCient {
/**
* 消息发送给的目标,这里选用抽象,提高扩展性
*/
private XxxHandler handler ;
/**
* 配置客户的处理器
* @param handler
*/
public void setHandler(XxxHandler handler) {
this.handler = handler;
}
public void reqExecute(String str){
handler.execute(str);
}
}
配置工厂,在工厂中完成责任链的层级关系和生产流程
package com.cctv.play;
public class HandlerFactory {
public static XxxHandler createHandler(){
/**
* 静态的方法,工厂会初始化好整条职责连的成员
*/
XxxHandler one = new XxxOne();
XxxHandler two = new XxxTwo();
XxxHandler xxx = new XxxXxx();
/**
* 将责任链连起来
*/
one.setHandler(two);
two.setHandler(xxx);
return one;
}
}
测试 :组装整个职责连
package com.cctv.play;
//该类为组装类,类似Web项目中的Controller
public class Test {
public static void main(String[] args) {
//构建请求
reqClient client = new reqClient();
//配置处理中心
client.setHandler(HandlerFactory.createHandler());
//发出请求....
client.reqExecute( 请求参数集合... );
}
}
无论前端还是后端,都和责任链接触良多,jdk的异常处理,过滤器链,目前火热的框架 Spring,doubbo,早起的java团队开发的AWT(被观察者模式取代),
前端的js事件模型等等.不定期更新.
全手打,有不对的地方欢迎留言.
当然这个模式从宏观角度来看属于模板模式
网友评论