职责链模式
职责链模式是一种拦截器机制 他将多层的if/elseif进行拆分为一个个的拦截器链式调用来达到if/else的功能
拦截器只负责拦截 这样可以将功能独立出来 达到解耦的目的
javaweb中拦截器机制(通过重写doChain方法来进行链式调用) 和springmvc中的拦截器机制 都是这个原理
角色 :
拦截器类
拦截器组装类
请求类
以拦截器拦截请求为例
//拦截器组装类
public class Chain {
private AbstractChain abstractChain;
private Request request;
public Chain(Request request){
this.request = request;
}
public Chain(){
}
public void setRequest(Request request) {
this.request = request;
}
//组装拦截器(按参数顺序)
public void connectChain(AbstractChain ... chains){
for (int i = 0; i < chains.length-1; i++) {
chains[i].setAbstractChain(chains[i+1]);
}
abstractChain = chains[0];
}
public void setFirstAbstractChain(AbstractChain abstractChain) {
this.abstractChain = abstractChain;
}
public void doChain(Request request){
abstractChain.doChain(request);
}
public void doChain(){
if(abstractChain!=null){
abstractChain.doChain(request);
}else {
System.out.println("请传入请求");
}
}
}
//拦截器抽象类(也可以写成接口)
public abstract class AbstractChain {
protected AbstractChain abstractChain;
private String name;
public AbstractChain(String name){
this.name = name;
}
public AbstractChain getAbstractChain() {
return abstractChain;
}
public void setAbstractChain(AbstractChain abstractChain) {
this.abstractChain = abstractChain;
}
public String getName() {
return name;
}
//通过实现doChain方法实现链式调用
public abstract void doChain(Request request);
}
//实现类(可以用反射或再次抽象减少代码冗余)
class Chain1 extends AbstractChain{
public Chain1(String name) {
super(name);
}
@Override
public void doChain(Request request) {
if(request.getMoney() < 1000){
System.out.println(getName()+ "开始处理请求 编号为:" + request.getId() + "处理金额为" + request.getMoney());
} else {
if (this.getAbstractChain() != null) {
abstractChain.doChain(request);
}
}
}
}
class Chain2 extends AbstractChain{
public Chain2(String name) {
super(name);
}
@Override
public void doChain(Request request) {
if(request.getMoney() >= 1000 && request.getMoney() < 10000){
System.out.println(getName()+ "开始处理请求 编号为:" + request.getId()+ "处理金额为" + request.getMoney());
} else {
if(this.getAbstractChain()!=null){
abstractChain.doChain(request);
}
}
}
}
class Chain3 extends AbstractChain{
public Chain3(String name) {
super(name);
}
@Override
public void doChain(Request request) {
if(request.getMoney() >= 10000){
System.out.println(getName()+ "开始处理请求 编号为:" + request.getId()+ "处理金额为" + request.getMoney());
} else {
if(this.getAbstractChain()!=null){
abstractChain.doChain(request);
}
}
}
}