请在后台配置参数,参数名称:topads
编程语言 php java

java设计模式-责任链模式(Chain of Responsibility Pattern)

java HTML我帮您 1年前  3182次浏览
责任链模式为了避免请求的发送者和接收者之间的耦合关系,使多个接受对象都有机会处理请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。通俗一点说就是,当客户提交一个请求时,从第一个对象开始,链中收到请求的对象要么亲自处理它,要么转发给链中的下一个候选者。提交请求的对象并不知道哪一个对象将会处理它。当然职责链中也可能没有可以处理该请求的对象,这种情况是允许发生的。
责任链模式(Chain of Responsibility)是Web项目中最经常用到的一个设计模式,比如是Apache Tomcat 的对Encoding的 处理,Struts2 的拦截器, jsp servlet 的Filter 等等,都是基于责任链模式设计的。比如有一个作业任务,先有一个对象对其负责处理,之后又交给其他的一个对象处理,一次传递下去,这是最通俗最简单的责任链模式的应用。
package com.html580.chain;

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

/**
* 处理过滤信息的过滤接口类
*/
interface Filter {
public String doFilter(String msg);
}

/**
*
* 负责专门过滤HTML代码的过滤器 实现了Filter 接口
*/
class HtmlFilter implements Filter {
@Override
public String doFilter(String msg) {
String result = msg.replace("<", "<").replace(">", ">");
return result;
}
}

/**
*
* 负责了处理敏感词汇的过滤器 实现了Filter 接口
*/
class SesitiveFilter implements Filter {

@Override
public String doFilter(String msg) {
return msg.replaceAll("敏感", "普通词汇");
}

}

/**
*
* 负责了处理敏感词汇的过滤器 实现了Filter 接口 实现Filter 接口的主要原因是:将自身也设计成一个Filter,容易构建一个chain。
*/
abstract class AbsractFilterChian implements Filter {
public List filters = new ArrayList();

public abstract String doFilter(String msg);

public abstract AbsractFilterChian addAbsractFilterChian(Filter filter);
}

class FilterChian extends AbsractFilterChian{
/**
* 要实现在一个链条中加入另一个链条,的一个好办法就是使用者一个链条也去实现那个对象的接口
*
* 前面使用的接口编程让 AbsractFilterChian extends Filter 这个个接口,系统会报错。是堆栈溢出问题
* 也没有细究是什么原因,会报这个异常,就直接更改成为了抽象类,使用 implements 去实现 filter 并且实现
* doFilter 方法,省得有那么多的麻烦。
*/
@Override
public AbsractFilterChian addAbsractFilterChian(Filter filter) {
filters.add(filter);
return this;
}

@Override
public String doFilter(String msg) {
for (Filter filter : filters) {
msg = filter.doFilter(msg);
}
return msg;
}

}

/**
*
* 提供处理的对外统一接口
*/
class MsgProcessor {
/**
* 多个过滤器组合到一起之后就会形成过滤器链。
* 好处是过滤规则的排序,
* 先后顺序的的原因,新旧规则可以灵活的替换更新
* 责任链模式
*/
private AbsractFilterChian chian;

public AbsractFilterChian getChian() {
return chian;
}

public void setChian(AbsractFilterChian chian) {
this.chian = chian;
}
private String msg;
public String getMsg() {
return msg;
}

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

public String process() {
return chian.doFilter(msg);
}
}
public class Client {
public static void main(String<> args) {

String msg = " 敏感信息";
AbsractFilterChian chian = new FilterChian();
chian.addAbsractFilterChian(new HtmlFilter());

AbsractFilterChian chian2 = new FilterChian();
chian2.addAbsractFilterChian(new SesitiveFilter());

chian.addAbsractFilterChian(chian2);

MsgProcessor processor = new MsgProcessor();

processor.setChian(chian);
processor.setMsg(msg);

System.out.println("转换前HTML结果:" + msg);
System.out.println("HTML结果:" + processor.process());
}
}
输出结果
转换前HTML结果: 敏感信息
HTML结果: 普通词汇信息



发表评论