责任链模式:所有的处理者都加入到这个链式,一个处理完之后,转给下一个。
1 抽象出责任接口,具体责任逻辑实现接口。
2 根据处理过程需要,将具体实现组合成链式调用
3 使用者使用链
4 责任链模式的调用过程如下图所示

特点:责任链模式是一种,典型的组合链式调用的方式。遵循一定的顺序来调用,典型:web请求中Filter
代码:
现有一个请求实例Request
package com.chen.strategy.chainproxy;
public class Request {
}
有一个抽象处理责任的接口
package com.chen.strategy.chainproxy;
public interface Repository {
void doProcess(Request reuqest, ReposibilityChain chain);
}
现有两个责任需要处理Request
package com.chen.strategy.chainproxy;
public class ResponsibilityA implements Repository {
@Override
public void doProcess(Request reuqest, ReposibilityChain chain) {
System.out.println("ResponsibilityA doing SomeThing");
chain.doProcess(reuqest);
System.out.println("After ResponsibilityA doing Something");
}
}
package com.chen.strategy.chainproxy;
public class ResponsibilityB implements Repository {
@Override
public void doProcess(Request reuqest, ReposibilityChain chain) {
System.out.println("ResponsibilityB doing Something");
chain.doProcess(reuqest);
System.out.println("After RepositoryA doing Something");
}
}
通过责任链的方式将两个责任添加到链里,再来实现调用
package com.chen.strategy.chainproxy;
import java.util.ArrayList;
import java.util.List;
/**
* 责任链模式实现方式
*/
public class ReposibilityChain {
private List<Repository> repositories;//所有的责任
private int index = 0;
public ReposibilityChain() {
this.repositories = new ArrayList<>();
}
public void doProcess(Request reuqest){
if(this.index<this.repositories.size()){
this.repositories.get(index++).doProcess(reuqest,this);//在此做到了链式调用,有点像递归。repositories,每次取出来的责任实例是不同的,来完成doProcess方法。
}
}
public static void main(String[] args) {
ReposibilityChain chain = new ReposibilityChain();
chain.register(new ResponsibilityB());
chain.register(new ResponsibilityA());
chain.doProcess(new Request());
}
public void register(Repository repository){
repositories.add(repository);//将责任注册到该集合中
}
}
网友评论