查看原文
其他

Java中的责任链设计模式,太牛了!

Mazin Java技术栈 2020-10-08


责任链设计模式的思想很简单,就是按照链的顺序执行一个个处理方法,链上的每一个任务都持有它后面那个任务的对象引用,以方便自己这段执行完成之后,调用其后面的处理逻辑。
下面是一个责任链设计模式的简单的实现:
public interface Task {
  public void run();
}

public class Task1 implements Task{
  
  private Task task;

  public Task1() {}
  
  public Task1(Task task){
    this.task = task;
  }
  @Override
  public void run() {
    System.out.println("task1 is run");
    if(task != null){
      task.run();
    }
  }
}

public class Task2 implements Task{

  private Task task;

  public Task2() {}
  
  public Task2(Task task){
    this.task = task;
  }
  @Override
  public void run() {
    System.out.println("task2 is run");
    if(task != null){
      task.run();
    }
  }
}

public class Task3 implements Task{

  private Task task;

  public Task3() {}
  
  public Task3(Task task){
    this.task = task;
  }
  @Override
  public void run() {
    System.out.println("task3 is run");
    if(task != null){
      task.run();
    }
  }
}


以上代码是模拟了三个任务类,它们都实现了统一个接口,并且它们都一个构造函数,可以在它们初始化的时候就持有另一个任务类的对象引用,以方便该任务调用。另外关注微信公众号:Java技术栈,在后台回复:设计模式,可以获取我整理的 N 篇最新设计模式教程,都是干货。
这个和服务器的过滤器有点类似,过滤器的实现也都是实现了同一个接口Filter。
public class LiabilityChain {

  public void runChain(){
    Task task3 = new Task1();
    Task task2 = new Task2(task3);
    Task task1 = new Task3(task2);
    task1.run();
  }

}


上面这段代码就是一个任务链对象,它要做的事情很简单,就是将所有要执行的任务都按照指定的顺序串联起来。

public class ChainTest {

  public static void main(String[] args) {
    LiabilityChain chain = new LiabilityChain();
    chain.runChain();
  }

}


当我们获取到责任链对象之后,调用其方法,得到以下运行结果:

以上是一个责任链的简单的实现,如果想要深入理解其思想,建议去观察一个过滤器链的执行源码。


作者:Mazin

https://my.oschina.net/u/3441184/blog/889552

- END -
推荐阅读:
1、12306 的架构也太 "牛X" 了吧!
2、Spring Cloud 升级最新 Greenwich 版本
3、Spring Boot 2.2.1 发布,一个有点坑的版本
4、头大!RabbitMQ 和 Kafka 到底怎么选?
5、分享一份 2019 最新 Java 架构师学习资料
关注Java技术栈公众号在后台回复:设计模式,可获取一份栈长整理的设计模式教程,都是干货。

点击「阅读原文」和栈长学更多~

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存