提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
本人对于设计模式的学习,仅供参考!
提示:以下是本篇文章正文内容,下面案例可供参考
一、责任链模式Chain of Responsibility
一个请求传过来,有多个对象负责进行处理由由每一个对象对其下家的引用而连接起来形成一条链。请求在链上传递,直到某一个对象决定处理此请求。发出请求的客户端,并不知道链上哪一个对象。最终处理这个请求,这使得系统可以在不影响客户端的情况下,动态重新组织和分配责任。
二、案例说明
1.介绍
使用场景:
JS中的时间冒泡,Java Web中的Tomcat对Encoding的处理,jsp servlet中的Filter,Struts2中的拦截器等。
优点:
1.降低耦合度,他将请求的接发送者和接收者解耦。
2.简化了对象,使得对象不需要知道链的结构。
3.增强给对象指派职责的灵活性。
4.增加新的请求处理类很方便。
缺点:
1.不能保证请求一定被接收。
2.系统性能将受到一定影响,且在代码调试时不太方便,可能造成循环调用。
3.可能不容易观察运行时特征,有碍于除错。
2.代码实现
我们用多个对象对Msg对象的信息描述进行处理。
Msg对象:
public class Msg {
private String msg;
private String name;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
处理器的抽象接口:
public interface Handle {
boolean doFilter(Msg msg);
}
具体处理器类:
public class HTMLFilter implements Handle {
@Override
public boolean doFilter(Msg msg) {
String m;
//处理器处理Msg对象过程
m=msg.getMsg().replace("<","[");
m=m.replace(">","]");
msg.setMsg(m);;
return true;
}
}
public class SensitiveFilter implements Handle {
@Override
public boolean doFilter(Msg msg) {
//处理器处理Msg对象过程
String m=msg.getMsg().replace("996","955");
msg.setMsg(m);
return true;
}
}
处理器链条:
//实现了处理器接口
public class HandleChain implements Handle {
//用来添加处理器
List<Handle> filters=new ArrayList<>();
@Override
public boolean doFilter(Msg msg) {
//把Msg对象交给链条中的处理器处理
for (Handle filter : filters) {
if (!filter.doFilter(msg)) return false;
}
return true;
}
//把处理器添加进filter中,链条也是处理器,使得处理器链条可以相互连接起来
public HandleChain add(Handle filter){
filters.add(filter);
return this;
}
}
代码测试:
public class Main {
public static void main(String[] args) {
//构建Msg对向
Msg msg=new Msg();
msg.setMsg("大家好!<script>欢迎来到996模式");
//构建处理器
Handle f1=new HTMLFilter();
Handle f2=new SensitiveFilter();
//将处理器添加进链条
HandleChain handleChain=new HandleChain();
HandleChain filterChain2=new HandleChain();
handleChain.add(f1);
filterChain2.add(f2);
//链条可以相互连接
handleChain.add(filterChain2);
//把Msg交给处理器链条进行处理
handleChain.doFilter(msg);
System.out.println(msg.getMsg());//大家好![script]欢迎来到955模式
}
}
总结
责任链模式的本质就是请求与处理,让请求在处理链中能进行传递与被处理,其独到之处就是将其节点处理者组合成了链式结构,并语序节点自身决定是否进行处理或转发,相当于让请求流动起来。