package com.atshiyou.dp.cor;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
Msg msg = new Msg();
msg.setMsg("大家好:),<script> 你们一辈子都是996 ");
List<Filter> filters = new ArrayList<>();
filters.add(new HTMLFilter());
filters.add(new SensitiveFilter());
for (Filter f: filters){
f.doFilter(msg);
}
System.out.println(msg);
}
}
class Msg{
String name;
String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public String toString() {
return "Msg{" +
"msg='" + msg + '\'' +
'}';
}
}
interface Filter{
void doFilter(Msg m);
}
class HTMLFilter implements Filter{
@Override
public void doFilter(Msg m) {
String r = m.getMsg();
r = r.replace('<', '[');
r = r.replace('>', ']');
m.setMsg(r);
}
}
class SensitiveFilter implements Filter{
@Override
public void doFilter(Msg m) {
String r = m.getMsg();
r = r.replaceAll("996","995");
m.setMsg(r);
}
}
代码分析:
msg经过两次filter 的过滤,然后最终才输出
f1 ,f2 f3 串成一条链,每个f都有自己的责任,所以叫责任链模式
修改上面的代码:增加这么一个链条的类
主函数的代码就变成了
我们再加一个小技巧,发现这里要两次add 不方便
修改链条的函数
主函数可以写成:
继续添加 过滤器filter,我们想生成两个链条
我们现在主函数的代码为:
我们发现要使用 两次dofilter()不方便,继续修改代码:
让链条链继承filter接口,让FilterChain也变成filter,我们就可以将另外一个链条链加入当前链条了
主函数变成:将fc2 加入到fc链条中,前提是 链条也应该继承filter
继续新的业务需求:
我们希望在进行过滤时,判断msg中有敏感词的时候,直接退出过滤,不将数据存在数据库里了
代码实现:
interface Filter{
boolean doFilter(Msg m);
}
//每个链条完成不同的业务(责任)
class HTMLFilter implements Filter{
@Override
public boolean doFilter(Msg m) {
String r = m.getMsg();
r = r.replace('<', '[');
r = r.replace('>', ']');
m.setMsg(r);
return true; // 简单起见就直接返回真
}
}
//有敏感词直接返回false,其余过滤器直接返回true,暂不做判断
class SensitiveFilter implements Filter{
@Override
public boolean doFilter(Msg m) {
String r = m.getMsg();
r = r.replaceAll("996","995");
m.setMsg(r);
m.setMsg(r);
return false;
}
}
class FaceFilter implements Filter{
@Override
public boolean doFilter(Msg m) {
String r = m.getMsg();
r = r.replace(":)","^U^");
m.setMsg(r);
return true;
}
}
class URLFilter implements Filter{
@Override
public boolean doFilter(Msg m) {
String r = m.getMsg();
r = r.replace("baidu.com","www.baidu.com");
m.setMsg(r);
return true;
}
}
class FilterChain implements Filter{
List<Filter> filters = new ArrayList<>();
public FilterChain add(Filter filter){
filters.add(filter);
return this;
}
public boolean doFilter(Msg m){
for (Filter f: filters){
if(!f.doFilter(m)) return false;
}
return true;
}
}
我们将filter接口的返回值设定为boolean,void都要修改为boolean,在敏感词判断的地方直接返回false,就不需要继续执行了
主要是这里的代码:就是实现 当进行过滤器处理的时候,判断到有敏感词就返回false
执行结果:只替换饿了 <> 和 996 其余两个过滤器直接就没有实现