责任链: 就是一个链式的自由组合,通常用于数据的加工,或者数据的校验等场景,特点是比较灵活,可扩展性非常强。
分享两种责任链的写法,思路大致一样,都是继承抽象类,得到具体的执行实例,然后认为控制执行顺序,完成。
举个栗子:
方法 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…,如有侵权,请联系删除。