责任链模式定义
多个对象都有机会处理请求,从而避免发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传送这个请求,直到有一个对象处理他为止。
码云地址地址:design_patterns
优点
1.把复杂功能拆分处理,让每个类只是负责一个处理逻辑。复用性更好,组合更加灵活。
2.请求和处理类分开,实现低耦合,更加利于扩展。
缺点
1.责任链太长或者每条链判断处理的时间太长会影响性能。特别是递归循环的时候。
2.不一定被处理,每个职责类的职责很明确,这就需要对写默认的处理了。
责任链模式重要的两点:分离职责,动态组合
处理者接口
public interface Handler<T>{
//责任链需要处理方法
void doAny(T t);
//判断执行状态方法
Boolean isOk(T t);
}
责任链抽象类, 负责维护链状态和执行链方法
public abstract class HandlerContext implements Handler<Integer>{
private HandlerContext nextHandler;
//设置下一个处理类
public HandlerContext setNext(HandlerContext nexHandler){
this.nextHandler = nexHandler;
return nextHandler;
}
//递归调用处理方法
public void executor(Integer integer) {
if (isOk(integer)){
doAny(integer);
}
if (nextHandler != null){
nextHandler.executor(integer);
}
}
}
请求处理者1
public class HandlerImpl extends HandlerContext {
@Override
public void doAny(Integer t) {
System.out.println("结果1:" + t);
}
@Override
public Boolean isOk(Integer integer) {
System.out.println("执行1");
return integer == 1;
}
}
请求处理者2
public class HandlerImpl2 extends HandlerContext {
@Override
public void doAny(Integer t) {
System.out.println("结果2:" + t);
}
@Override
public Boolean isOk(Integer integer) {
System.out.println("执行2");
return integer == 2;
}
}
请求处理者3
public class HandlerImpl3 extends HandlerContext {
@Override
public void doAny(Integer t) {
System.out.println("结果3:" + t);
}
@Override
public Boolean isOk(Integer integer) {
System.out.println("执行3");
return integer == 3;
}
}
测试类
public class Test {
public static void main(String[] args) {
HandlerContext handlerContext = new HandlerImpl();
HandlerContext handlerContext2 = new HandlerImpl2();
HandlerContext handlerContext3 = new HandlerImpl3();
handlerContext.setNext(handlerContext2)
.setNext(handlerContext3);
handlerContext.executor(2);
}
}
执行结果
执行1
执行2
结果2:2
执行3
本文部分定义参考了网上博文和网上信息…