2020-12-08 责任链

34 阅读1分钟

责任链: 就是一个链式的自由组合,通常用于数据的加工,或者数据的校验等场景,特点是比较灵活,可扩展性非常强。

分享两种责任链的写法,思路大致一样,都是继承抽象类,得到具体的执行实例,然后认为控制执行顺序,完成。
举个栗子:
方法 A(加1) B(加2) C(加3) ,输入一个数字 int num =1,调用 A B C ,结果为7。调用 AABC 结果为8。

开始代码。第一种:
AddBean

AddOne
AddThree
AddTwo

yanzhengma

yanzhengmaTest

public abstract class AddBean {

   public abstract int addNum(int num);

   private AddBean nextAddBean;


   public AddBean(AddBean nextAddBean) {
      this.nextAddBean = nextAddBean;
   }

   public AddBean getNextAddBean() {
      return nextAddBean;
   }
}
//=========================================================================
public class AddOne extends AddBean {


    public AddOne(AddBean nextAddBean) {
        super(nextAddBean);
    }

    @Override
    public AddBean getNextAddBean() {
        return super.getNextAddBean();
    }

    @Override
    public int addNum(int num) {
        num = num +1;
        return getNextAddBean()==null?num:getNextAddBean().addNum(num);
    }
}
//=========================================================================
public class AddThree extends AddBean {


    public AddThree(AddBean nextAddBean) {
        super(nextAddBean);
    }

    @Override
    public AddBean getNextAddBean() {
        return super.getNextAddBean();
    }

    @Override
    public int addNum(int num) {
        num = num +3;
        return getNextAddBean()==null?num:getNextAddBean().addNum(num);
    }
}
//=========================================================================
public class AddTwo extends AddBean {


    public AddTwo(AddBean nextAddBean) {
        super(nextAddBean);
    }

    @Override
    public AddBean getNextAddBean() {
        return super.getNextAddBean();
    }

    @Override
    public int addNum(int num) {
        num = num +2;
        return getNextAddBean()==null?num:getNextAddBean().addNum(num);
    }
}

//=========================================================================
@Service
public class yanzhengma {
    public int zerenlian(int num) {
        AddBean addBean = new AddOne(new AddTwo(new AddOne(new AddThree(null))));
        return addBean.addNum(num);
    }
}
//=========================================================================

@SpringBootTest(classes=TestService.class)
class yanzhengmaTest {

    @Autowired
    yanzhengma yanzhengma;

    @Test
    public void addnum(){
        System.out.println(yanzhengma.zerenlian(4));
    }
}

上述五个类,包括测试类.执行测试类,即可出现效果

第二种写法,也是标准写法:

执行1
执行2
执行3

AbstractBean
FactoryAutoware
StartChina
TestService

TestServiceTest

@Service
public class 执行1 extends AbstractBean {
    @Override
    public boolean dohandel() {
        System.out.println(1);
        return true;
    }
}
//========================================================================
@Service
public class 执行2 extends AbstractBean {
    @Override
    public boolean dohandel() {
        System.out.println(2);
        return true;
    }
}
//========================================================================
@Service
public class 执行3 extends AbstractBean {
    @Override
    public boolean dohandel() {
        System.out.println(3);
        return true;
    }
}
//========================================================================
public abstract class AbstractBean {

    private AbstractBean next;

    public void setNext(AbstractBean next){
        this.next = next;
    }

    public abstract boolean dohandel();

    public Boolean start(){
        boolean dohandel = this.dohandel();
        if (dohandel && this.next !=null) {
            this.next.start();
        }
        return true;
    }

}
//========================================================================
@Component
public class FactoryAutoware implements ApplicationContextAware {

    private static Map<String,AbstractBean> map = new HashMap<>();

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        map.put("1",applicationContext.getBean(执行1.class));
        map.put("2",applicationContext.getBean(执行2.class));
        map.put("3",applicationContext.getBean(执行3.class));
    }

    public AbstractBean get(String type){
        return map.get(type);
    }
}

//========================================================================
public class StartChina {

    private AbstractBean first;//第一个
    private AbstractBean next;//下一个

    public void addHandle(AbstractBean next) {
        if (this.first == null) {
            this.first = next;
            this.next = next;
            return;
        }
        this.next.setNext(next);//设置下一个抽象类
        this.next = next;// 记录当前抽象类实例,为下次设置做准备
    }

    public void handle() {
        if (first !=null) {
            first.start();
        }
    }

}
//========================================================================
@Service
public class TestService {

    @Autowired
    FactoryAutoware factoryAutoware;

    public void zhingxing() {

        StartChina startChina = new StartChina();
        startChina.addHandle(factoryAutoware.get("1"));
        startChina.addHandle(factoryAutoware.get("2"));
        startChina.addHandle(factoryAutoware.get("3"));
        startChina.handle();

    }

}

//========================================================================
@SpringBootTest
class TestServiceTest {

    @Autowired
    TestService testService;

    @Test
    public void dfafd(){
        testService.zhingxing();
    }

}

本文转自 jimolvxing.blog.csdn.net/article/det…,如有侵权,请联系删除。