电子商城网站开发对接,简历模板免费下载word格式,做烘焙原材料在哪网站买,怎么做自己网站产品seo责任链的介绍
责任链模式是一种对象的行为模式。在责任链模式里#xff0c;很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递#xff0c;直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
在责任链模式当中客户端只用执行一次流程开始的请求便不再需要参与到流程执行当中责任链上的流程便能够自己一直往下执行客户端同样也并不关心执行流程细节从而实现与流程之间的解耦。
责任链的结构
责任链模式需要有以下几个角色
抽象处理器Handler处理器抽象接口定义了处理请求的方法和执行下一步处理的处理器具体处理器ConcreteHandler执行请求的具体实现先根据请求执行处理逻辑完成之后将请求交给下一个处理器执行调用者调用者通过创建处理器并将请求交给处理器进行处理
Java实现
Context是全部参数用于在各个处理器中流转。
Data
Builder
public class Context {private String name;private String type;
}
Handler抽象的处理器定义了执行和判断是否需要执行的接口。
public interface Handler {void execute(Context context, HandlerChain chain);default boolean skip(Context context) {return false;}
}NameHandler用来处理参数中的name属性
AutoService(Handler.class)
public class NameHandler implements Handler {Overridepublic void execute(Context context, HandlerChain chain) {System.out.println(name: context.getName());chain.execute(context);}Overridepublic boolean skip(Context context) {if (name1.equals(context.getName())) {return true;}return false;}
}TypeHandler用来处理参数中的type属性
AutoService(Handler.class)
public class TypeHandler implements Handler {Overridepublic void execute(Context context, HandlerChain chain) {System.out.println(type: context.getType());chain.execute(context);}
}HandlerChain用于封装处理器链条提供执行入口。
public class HandlerChain {private int index;private final ListHandler handlers;HandlerChain(ListHandler handlers) {this.handlers handlers;}public void execute(Context context) {if (this.index handlers.size()) {Handler handler handlers.get(this.index);boolean skip handler.skip(context);if (skip) {this.execute(context);}else {handler.execute(context, this);}}}}测试效果
public class ChainTest {public static void main(String[] args) {ServiceLoaderHandler serviceLoader ServiceLoader.load(Handler.class);ListHandler handlers StreamSupport.stream(serviceLoader.spliterator(), false).collect(Collectors.toList());HandlerChain handlerChain new HandlerChain(handlers);Context context Context.builder().name(name).type(type).build();handlerChain.execute(context);HandlerChain handlerChain1 new HandlerChain(handlers);Context context1 Context.builder().name(name1).type(type1).build();handlerChain1.execute(context1);}
}控制台输出
name: name
type: type
type: type1name属性是name1的context是不需要NameHandler处理的。