简单解释:简单来说就是该设计模式用于对某个对象或者请求进行一系列的处理,这些处理逻辑正好组成一个链条
传统实现
假设这样的场景:传入了一段内容,需要对这段文本进行加工;比如过滤敏感词、错别字修改、最后署上版权等操作。
常见的写法如下:
public class Main {
public static void main(String[] args) {
String msg = "内容内容内容" ;
String result = Process.sensitiveWord()
.typo()
.copyright();
}
}
这样看似没啥问题也能解决需求,但如果我还需要为为内容加上一个统一的标题呢?在现有的方式下就不得不新增处理方法,并且是在这个客户端( Process
)的基础上进行新增。
显然这样的扩展性不好。
责任链模式实现
这时候就到了责任链模式发挥作用了。
该需求非常的符合对某一个对象、请求进行一系列处理的特征。
于是我们将代码修改:
这时 Process
就是一个接口了,用于定义真正的处理函数。
public interface Process {
/**
* 执行处理
* @param msg
*/
void doProcess(String msg) ;
}
同时之前对内容的各种处理只需要实现该接口即可:
然后只需要给客户端提供一个执行入口以及添加责任链的入口即可:
publicclassMsgProcessChain{
privateList<Process>chains =newArrayList<>();
/**
* 添加责任链
* @param process
* @return
*/
publicMsgProcessChainaddChain(Processprocess){
chains.add(process);
returnthis;
}
/**
* 执行处理
* @param msg
*/
publicvoidprocess(Stringmsg){
for(Processchain :chains){
chain.doProcess(msg);
}
}
}
这样使用起来就非常简单:
publicclassMain{
publicstaticvoidmain(String[]args){
Stringmsg ="内容内容内容==";
MsgProcessChainchain =newMsgProcessChain()
.addChain(newSensitiveWordProcess())
.addChain(newTypoProcess())
.addChain(newCopyrightProcess());
chain.process(msg);
}
}
当我需要再增加一个处理逻辑时只需要添加一个处理单元即可( addChain(Processprocess)
),并对客户端 chain.process(msg)
是无感知的,不需要做任何的改动。