设计模式之责任链

本文深入探讨了责任链设计模式的应用,通过实例讲解了如何使用该模式进行消息过滤,包括敏感词屏蔽、表情替换等,并展示了如何灵活地添加新的过滤器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   什么是责任链? 我全部围绕着代码来写:

    首先,我们经常在上网的时候会遇见这样的问题,你发出去一部分消息,但是在屏幕显示出来的跟你实际发送出去的有所差别,比如说在玩有些游戏的时候,你想骂人的时候,但是你会发现你的有部分会变为其它的,比如星号。因为在你发送消息出去之后,程序会检查你的消息时候包含敏感词汇,如果有,它会给你改了或者删除掉,我们今天就来介绍这种设计模式。

 假如说MSG就是你发的消息,那么他就会经过一层一层的过滤,再返回回来。

现在假如说我们有这样一串字符串:

String mesg = "大家好:),<scip>, w我是你caca";

我们想把里面的 :)  替换成  ^v^  。把  <  >  替换成  [ ]   。 caca 替换成 ** 。

那么我们应该写 3 个Filter, 

public class FaceFilter implements Filter {

	@Override
	public String doFilter(String str) {

		return str.replace(":)", "^V^");
	}

}
public class HTMLFilter implements Filter {

	@Override
	public String doFilter(String str) {

		return str.replace("<", "[").replace(">", "]");
	}

}
public class Sensitive implements Filter {

	public String doFilter(String str) {

		return str.replace("caca", "$$");
	}


}

这里我们让他们其实先了一个共同的Filter接口。

在这里面,我们定义一个Filter数组,然后挨着调用,然后就可以调用了。

那么我们在想一个问题,这只是我们的一部分过滤器,如果我们还有其它的过滤器想加进来我们怎么处理?比如下面这种情况:

我们有一个新的过滤器想加紧去,那么我们该怎么设计?

那么我们再新建一个类,然后定义一个容器,定义一个方法,往里面存一些Filter,那么你要按什么顺序过滤,以及你想要加什么新的过滤器,那么你只要调用方法往里面加,然后挨着用就可以了。

import java.util.ArrayList;
import java.util.List;

public class FilterChain {
	List<Filter> l = new ArrayList<Filter>();
	
	public void AddFilter(Filter f){
		l.add(f);
	}
	
	public String ChuLi(String s){
		String str = s;
		for(Filter fs : l){
			str = fs.doFilter(str);
		}
		
		return str;
	}
}
public class Main {
	public static void main(String[] args) {
		String mesg = "大家好:),<scip>, w我是你caca";
		
		FilterChain fc = new FilterChain();
		fc.AddFilter(new HTMLFilter());
		fc.AddFilter(new FaceFilter());
		fc.AddFilter(new Sensitive());
		
		Process p = new Process();
		p.setMesg(mesg);
		p.setFc(fc);
		System.out.println(p.Processor());
	}
}

现在那么你想按什么顺序过滤或者加新的过滤器,只需要Add就可以了。

现在是一个消息从客户端发送到服务器端,一般的情况下服务器端还会返回一个消息到客户端,

 那么,返回的经过的过滤器刚好和接收到的相反,那么我们该如何设计?我简单的说一下思想。

 没错,看起来有点像递归。我们再把程序贴上结合起来看。

public interface Filter {
	public void doFilter(Request request, Responce responce, FilterChain chian);
}
import java.util.ArrayList;
import java.util.List;

public class FilterChain {
	List<Filter> l = new ArrayList<Filter>();
	private int index = 0;
	
	public void AddFilter(Filter f){
		l.add(f);
	}
	
	public void ChuLi(Request request, Responce responce, FilterChain chian){
		if(index == l.size()) return;
		Filter f = l.get(index);
		index++;
		f.doFilter(request, responce, chian);
	}
}
public class FaceFilter implements Filter {


	public void doFilter(Request request, Responce responce, FilterChain chian) {
		request.request = request.request.replace(":)", "^V^")
				+ "---FaceFilter";
		chian.ChuLi(request, responce, chian);
		
		responce.responce += "---FaceFilter";
		
	}

}
public class HTMLFilter implements Filter {


	@Override
	public void doFilter(Request request, Responce responce, FilterChain chian) {
		request.request = request.request.replace("<", "[").replace(">", "]") + "---HTMLFilter";
		chian.ChuLi(request, responce, chian);
		responce.responce += "---HTMLFilter";
	}

}
public class Sensitive implements Filter {

	public String doFilter(String str) {

		return str.replace("caca", "$$");
	}

	@Override
	public void doFilter(Request request, Responce responce, FilterChain chian) {
		request.request = request.request.replace("caca", "**") + "---Sentive";
		chian.ChuLi(request, responce, chian);
		responce.responce += "---Sentive";
	}


}
public class Main {
	public static void main(String[] args) {
		String mesg = "大家好:),<scip>, w我是你caca";
		
		FilterChain fc = new FilterChain();
		fc.AddFilter(new HTMLFilter());
		fc.AddFilter(new FaceFilter());
		fc.AddFilter(new Sensitive());
		
		Request rq = new Request();
		rq.setRequest(mesg);
		
		Responce rp = new Responce();
		rp.setResponce("responce");
		
		fc.ChuLi(rq, rp,fc);
		System.out.println(rq.getRequest());
		System.out.println(rp.getResponce());
	}
}

我们的Reflect 和 Responce就简单封装了两个字符串,我们首先按照顺序调用第一个过滤器,让后执行到到Responce前面的时候调用下一个过滤器,然后依次下去,到最后再一层一层的返回,那么输出结果就为:

大家好^V^,[scip], w我是你**---HTMLFilter---FaceFilter---Sentive
responce---Sentive---FaceFilter---HTMLFilter

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值