场景需求:有一串字符串,需要将其中的个别字符做replace操作。需求经常改变,某一个时刻需要做这种替换操作,下次需要增加另一种操作,此时如果把替换方法硬编码到一个类中,则后期难以维护。此时需要利用接口和责任链的知识。
码示例:
1:定义一个过滤器接口
2:两个不同实现类(不同的字符串处理需求)
替换姓名的实现类
替换性别的实现类
调用者:
BBBAFFFF女女女
StrResolver
责任链的核心在在于:
1:strResolver类持有一个list属性,并且,往list添加元素的时候执行addFilter 方法的时候,返回this, 把当前对象返回给调用者,那么当前对象就可以继续执行addFilter方法,给自己的属性list中添加元素(当然在spring通过注解的方式装在到集合中),将所有需要执行的filter对象都装到list中去,从而实现链式调用addFilter方法。2:将所有过滤对象,装到一个list中,循环调用doFilter方法,从而实现需求。3: 提供了一个借口,需求新增的时候,只用实现Filter接口就可以了,实现了水平扩展。
责任链模式加强版上面的实现的过滤链可以用下图a)表示出来,整个过程只对msg过滤了一次。而JavaWeb中的过滤器链和Struts2中的拦截器栈执行的过程可以形象的表示为图b)。
下面用程序模拟JavaWeb中的过滤器,实现类似于对Request和Response的过滤。主要涉及的类如下所示:
代码示例
结果
领取专属 10元无门槛券
私享最新 技术干货