时隔2年,现在已经从java走向了c# , 复习设计模式的时候想起马士兵老师的责任链实现方式, 太经典了,经典的不是这个链的实现,而是他将责任链类也实现了接口,这样链本身也是一个Filter,从而可以实现将该类的实例当成Filter添加到该类的实例中。
using System;
using System.Collections.Generic;
public interface Filter
{
String doFilter(String str);
}
public class FilterChain : Filter
{
List<Filter> filters = new List<Filter>();
public FilterChain addFilter(Filter f)
{
this.filters.Add(f);
return this;
}
public String doFilter(String str)
{
String r = str;
foreach (Filter f in filters)
{
r = f.doFilter(r);
}
return r;
}
}
public class HTMLFilter : Filter
{
public String doFilter(String str)
{
String r = str.Replace('<', '[')
.Replace('>', ']');
return r;
}
}
public class SensitiveFilter : Filter
{
public String doFilter(String str)
{
String r = str.Replace("被就业", "就业")
.Replace("敏感", "");
return r;
}
}
public class FaceFilter : Filter
{
public String doFilter(String str)
{
return str.Replace(":)", "^V^");
}
}
public class MsgProcessor
{
public FilterChain Fc { get; set; }
public string Msg { get; set; }
public String process()
{
return Fc.doFilter(this.Msg);
}
}
public class Program
{
static void Main(string[] args)
{
String msg = "大家好:),<script>,敏感,被就业,网络授课没感觉,因为看不见大家伙儿";
MsgProcessor mp = new MsgProcessor();
mp.Msg=msg;
FilterChain fc = new FilterChain().addFilter(new HTMLFilter()).addFilter(new SensitiveFilter());
FilterChain fc2 = new FilterChain().addFilter(new FaceFilter());
fc.addFilter(fc2);//经典之处,将1个链添加到另一个链
mp.Fc=fc;
String result = mp.process();
Console.WriteLine(result);//字符串非法字符过滤掉的结果
Console.Read();
}
}