设计模式学习笔记--责任链模式

责任链模式

责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
在这里插入图片描述

场景

我们有一个字符串String msg = ":):,<script>,敏感,被就业,网络授课";我们希望应用以下三个规则对字符串进行过滤和谐处理:

  1. 将字符串中出现的<>符号替换成[

  2. 处理字符串中的敏感信息,将被就业和谐成就业

  3. 将字符串中出现的:):转换成^V^;

字符串会依次运用这三条规则,对字符串进行处理,每个规则都有自己需要完成的责任和任务。

定义具有过滤功能的接口Filter

具体的过滤规则需要实现该接口

public interface Filter {
	String doFilter(String str);
}

定义具体的过滤处理规则

规则一、处理字符串中的HTML标记HTMLFilter

public class HTMLFilter implements Filter {

	@Override
	public String doFilter(String str) {
		//process the html tag <>
		return str.replace('<', '[')
				   .replace('>', ']');		
	}
}

规则二、敏感字眼的过滤规则SesitiveFilter

public class SesitiveFilter implements Filter {

	@Override
	public String doFilter(String str) {
		//process the sensitive words
		String r = str.replace("被就业", "就业")
			 .replace("敏感", "");
		
		return r;
	}
}

规则三、FaceFilter

public class FaceFilter implements Filter {

    @Override
    public String doFilter(String str) {
        return str.replace(":)", "^V^");
    }
}

定义责任链FilterChain

public class FilterChain implements Filter {
	List<Filter> filters = new ArrayList<Filter>();
	
	public FilterChain addFilter(Filter f) {
		this.filters.add(f);
		return this;
	}
	
	public String doFilter(String str) {
		String r = str;
		for(Filter f: filters) {
			System.out.println("调用类" + f.getClass().getName());
			r = f.doFilter(r);
		}
		return r;
	}
}

结束EndFilter

public class EndFilter implements Filter {
    @Override
    public String doFilter(String str) {
        return str + "EndFilter";
    }
}

Msg加工类MsgProcessor

public class MsgProcessor {
    private String msg;

    //Filter[] filters = {new HTMLFilter(), new SesitiveFilter(), new FaceFilter()};
    FilterChain fc;

    public FilterChain getFc() {
        return fc;
    }

    public void setFc(FilterChain fc) {
        this.fc = fc;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String process() {
        return fc.doFilter(msg);
    }
}

测试Main

public class Main {

    public static void main(String[] args) {
        String msg = "大家好:),<script>,敏感,被就业,网络授课没感觉,因为看不见大家伙儿";
        MsgProcessor mp = new MsgProcessor();
        mp.setMsg(msg);

		//第一责任链
        FilterChain fc = new FilterChain();
        fc.addFilter(new HTMLFilter()).addFilter(new SesitiveFilter());

		//第二责任链(相当于一个大的Filter)
        FilterChain fc2 = new FilterChain();
        fc2.addFilter(new FaceFilter()).addFilter(new EndFilter());

        fc.addFilter(fc2);
        mp.setFc(fc);

        String result = mp.process();
        System.out.println(result);
    }
}

在这里插入图片描述

测试结果

调用类com.bjsxt.dp.filter.HTMLFilter
调用类com.bjsxt.dp.filter.SesitiveFilter
调用类com.bjsxt.dp.filter.FilterChain
调用类com.bjsxt.dp.filter.FaceFilter
调用类com.bjsxt.dp.filter.EndFilter
大家好^V^,[script],,就业,网络授课没感觉,因为看不见大家伙儿EndFilter

请求从前向后过滤,响应从后向前处理,参考https://www.cnblogs.com/ysw-go/p/5432921.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值