回到目录
说明
复合的责任链,类似于管道模式,只要符合条件,说会向下传递,不会终止
算法说明
- 按最高优先级去使用,符合就用,不符合就走下一个策略
- 具体链条,有点像pipeline管道模式
- BlackHandler ip=172.17.0.11
- RateLimitHandler header=is-black
- WriteBlackHandler header=real-black
继承抽象类
- AbstractHandler 抽象的责任处理者
- 抽象方法action,需要各个子类【具体的责任处理者】自己去实现
- final修饰的方法,封装了实现细节,子类不能重写
- setNextHandler方法,设置下一个链条的【责任处理者】
- HandlerFactory 责任工厂
- 通过一个责任处理列表,返回一个责任链条
- 责任链条可以持久化到数据库里
责任链如果没有终止条件,就类似于pipeline管道了
graph TDRequest[post body]-->A[BlackHandler]A --> B[RateLimitHandler]B --> C[WriteBlackHandler]C --> D[EndHandler]测试代码
抽象处理者- public abstract class AbstractHandler<T> {
- private AbstractHandler nextHandler;
- public final void setNextHandler(AbstractHandler nextHandler) {
- this.nextHandler = nextHandler;
- }
- protected abstract void action(T body);
- // final表示不允许子类重写
- public final void handleRequest(T body) {
- action(body);
- if (this.nextHandler != null)
- this.nextHandler.handleRequest(body);
- }
- }
复制代码 具体处理者- public class BlackHandler extends AbstractHandler<Request> {
- private static final Logger logger = LoggerFactory.getLogger(CouponHandler.class);
- @Override
- public void action(Request body) {
- logger.info("BlackHandler 处理");
- }
- }
- public class RateLimitHandler extends AbstractHandler<Request> {
- private static final Logger logger = LoggerFactory.getLogger(CouponHandler.class);
- @Override
- protected void action(Request body) {
- logger.info("RateLimitHandler 处理");
- }
- }
- public class WriteBlackHandler extends AbstractHandler<Request> {
- private static final Logger logger = LoggerFactory.getLogger(CouponHandler.class);
- @Override
- protected void action(Request body) {
- logger.info("WriteBlackHandler 处理");
- }
- }
- public class EndHandler extends AbstractHandler<Request> {
- private static final Logger logger = LoggerFactory.getLogger(CouponHandler.class);
- @Override
- protected void action(Request body) {
- logger.info("EndHandler 处理");
- }
- }
复制代码 处理者工厂和请求数据体- public class HandlerFactory {
- public static <T extends Request> AbstractHandler<T> createHandler(List> handlerModels) {
- AbstractHandler<T> handler = null;
- AbstractHandler<T> previousHandler = null;
- for (AbstractHandler<T> currentHandler : handlerModels.stream().collect(Collectors.toList())) {
- if (previousHandler != null) {
- previousHandler.setNextHandler(currentHandler);
- }
- else {
- handler = currentHandler;
- }
- previousHandler = currentHandler;
- }
- return handler;
- }
- }
- @AllArgsConstructor
- @NoArgsConstructor
- @Data
- public class Request {
- private String ip;
- private String userId;
- }
复制代码 测试用例- public static void main(String[] args) {
- List> abstractHandlers = Arrays.asList(new RateLimitHandler(), new BlackHandler(),
- new WriteBlackHandler(),new EndHandler());
- AbstractHandler<Request> abstractHandler = HandlerFactory.createHandler(abstractHandlers);
- abstractHandler.handleRequest(new Request("1", "user1"));
- }
复制代码 如果希望将你的责任链处理存储到数据库中,那个在handleFactory里,就需要接口className了,例如下面的代码:- public static Handler handlerFactory() {
- List<HandlerModel> handlerModels = new ArrayList<>();
- handlerModels
- .add(new HandlerModel("CouponHandler", "com.lind.common.pattern.chinaorder.handler.CouponHandler", 1));
- handlerModels.add(
- new HandlerModel("DiscountHandler", "com.lind.common.pattern.chinaorder.handler.DiscountHandler", 2));
- handlerModels.add(
- new HandlerModel("BigGiftHandler", "com.lind.common.pattern.chinaorder.handler.BigGiftHandler", 3));
- handlerModels.add(new HandlerModel("VipHandler", "com.lind.common.pattern.chinaorder.handler.VipHandler", 4));
- return createHandler(handlerModels);
- }
- private static Handler createHandler(List<HandlerModel> handlerModels) {
- Handler handler = null;
- Handler previousHandler = null;
- for (HandlerModel handlerModel : handlerModels.stream().sorted().collect(Collectors.toList())) {
- try {
- Handler currentHandler = (Handler) Class.forName(handlerModel.getClassPath()).newInstance();
- if (previousHandler != null) {
- previousHandler.setNextHandler(currentHandler);
- }
- else {
- handler = currentHandler;
- }
- previousHandler = currentHandler;
- }
- catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
- throw new RuntimeException(e);
- }
- }
- return handler;
- }
复制代码 回到目录
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |