搜索
您的当前位置:首页正文

【责任链模式】责任链模式结合Spring实战Demo

来源:筏尚旅游网
【责任链模式】责任链模式结合Spring实战Demo

备注:

责任链与策略模式有很多相似之处,如都是⾏为型设计模式,都能够处理代码中的if-else逻辑 主要区别在于:

策略模式 封装了算法,通过上下⽂对象去接受客户端的数据,根据数据类型执⾏不同的算法

策略模式的客户端知道所有算法以及各种算法的区别

package com.gabriel.stage.design;

import cn.hutool.core.collection.CollectionUtil;

import com.gabriel.stage.common.enums.HandlerBeanEnum;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.ApplicationContext;import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;import java.util.LinkedList;import java.util.List;

/**

* @author: Gabriel

* @date: 2020/3/15 23:53 * @description 职责处理器 */

@Component

public class ExecuteHandler { @Autowired

private ApplicationContext context;

private List handlerList = new LinkedList<>(); private Handler handler; public Handler getHandler() { return handler; }

/**

* 该⽅法会在该对象创建之后被调⽤ *

* @throws Exception */

@PostConstruct

public void afterPostConstruct() throws Exception {

HandlerBeanEnum[] values = HandlerBeanEnum.values(); for (HandlerBeanEnum value : values) {

Handler bean = context.getBean(value.getBeanName(), Handler.class); handlerList.add(bean); }

if (CollectionUtil.isNotEmpty(handlerList)) { for (int i = 1; i < handlerList.size(); i++) { //当前处理器

Handler currentHandler = handlerList.get(i - 1); //下⼀个处理器

Handler nextHandler = handlerList.get(i); //将处理器串成链表

currentHandler.setNextHandler(nextHandler); }

this.handler = handlerList.get(0); } }}

package com.gabriel.stage.design;

import org.springframework.stereotype.Component;/**

* @author: Gabriel

* @date: 2020/3/15 23:41 * @description A处理器 */

@Component(\"aHandler\")

public class AHandler extends Handler {

private final Integer order = 1;

private Handler nextHandler; @Override

public Handler getNextHandler() { return nextHandler; }

@Override

public void setNextHandler(Handler nextHandler) { this.nextHandler = nextHandler; }

public final Integer myNum = 10;

@Override

public void dealRequest(Integer num) { if (myNum.equals(num)) {

System.out.println(\"num==10,A责任链处理\"); }else {

//交给下⼀个处理器处理

nextHandler.dealRequest(num); } }}

package com.gabriel.stage.design;

import lombok.Data;

import org.springframework.stereotype.Component;/**

* @author: Gabriel

* @date: 2020/3/15 23:41 * @description B处理器 */

@Component(\"bHandler\")

public class BHandler extends Handler {

private final Integer order = 2; private Handler nextHandler; @Override

public Handler getNextHandler() { return nextHandler; }

@Override

public void setNextHandler(Handler nextHandler) { this.nextHandler = nextHandler; }

public final Integer myNum = 100;

@Override

public void dealRequest(Integer num) { if (myNum == num) {

System.out.println(\"num==100,B责任链处理\"); }else {

nextHandler.dealRequest(num); } }}

package com.gabriel.stage.design;

import org.springframework.stereotype.Component;/**

* @author: Gabriel

* @date: 2020/3/15 23:41 * @description C处理器 */

@Component(\"cHandler\")

public class CHandler extends Handler { private final Integer order = 3; @Override

public void dealRequest(Integer num) {

System.out.println(\"num!=10 && num!=100,C责任链处理\"); }}

package com.gabriel.stage.common.enums;import lombok.AllArgsConstructor;import lombok.Getter;

/**

* @author: Gabriel

* @date: 2020/3/16 14:32

* @description 处理器Bean枚举 */

@Getter

@AllArgsConstructor

public enum HandlerBeanEnum { AHandler(\"aHandler\"), BHandler(\"bHandler\"), CHandler(\"cHandler\"); private String beanName;}

@Autowired

private ExecuteHandler executeHandler; /**

* 测试责任链模式 * @return */

@GetMapping(\"/test/{num}\")

public Result testHandler(@PathVariable Integer num){ Handler handler = executeHandler.getHandler(); handler.dealRequest(num); return Result.success(); }

因篇幅问题不能全部显示,请点此查看更多更全内容

Top