兄弟们,老铁们.又到了学习锻炼我们可爱小小大脑的时候了~~~~~
喝了这碗鸡血,学就完了~~~
青年同志们必须记住,想要连跑带跳地把过去的一切文化遗产得着,那是办不到的。这需要有坚定的顽强性和艰苦的劳动。要知道,在这条路上克服困难,这件事本身就是非常好的兴奋剂。

1.责任链模式定义

使多个对象都有机会处理请求,从而避免请求的发送
者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
责任链模式的提出是为了“解耦”,以应变系统需求的变更和不明确性。

2.责任链模式适用场景

  • 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
  • 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
  • 可处理一个请求的对象集合应被动态指定。

3.责任链模式组成

责任链模式由两个角色组成:

  • 抽象处理者角色(Handler):它定义了一个处理请求的接口。当然对于链子的不同实现,也可以在这个角色中实现后继链。
  • 具体处理者角色(Concrete Handler):实现抽象角色中定义的接口,并处理它所负责的请求。如果不能处理则访问它的后继者。
    责任链模式结构相对简单,就不放类图了,就是一个集成或者实现.

4.实现

责任链模式让我想起了前几天去医院,因为肩膀使不上力气所以就去医院看医生,但是不确定是什么原因导致的,就先挂了一个骨科,等骨科看完后又和我说有可能是神经导致的,又让我去神经内科看看.

科室类

public abstract class Department {

  private Department next;

  public Department getNext() {
    return next;
  }

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

  abstract void doSome(Person person);
}

儿科(随便加的一个,毕竟我这么大了不可能去看儿科)

public class Pediatrics extends Department {

  private final String name = "儿科";
  private final int num = 0;

  @Override
  void doSome(Person person) {
    if (this.num != person.getLevel()){
      System.out.println(name + " 未收治了病人 "+ person.getName() + "-----------移交其他科室医治");
      this.getNext().doSome(person);
    }else{
      System.out.println(name + " 收治了病人 "+ person.getName());
    }
  }
}

骨科

public class Orthopedics extends Department{

  private final String name = "骨科";
  private final int num = 1;

  @Override
  void doSome(Person person) {
    if (this.num != person.getLevel()){
      System.out.println(name + " 未收治了病人 "+ person.getName() + "-----------移交其他科室医治");
      this.getNext().doSome(person);
    }else{
      System.out.println(name + " 收治了病人 "+ person.getName());
    }
  }

}

神经科

public class Neurology extends Department {

  private final String name = "神经科";
  private final int num = 2;

  @Override
  void doSome(Person person) {
    if (this.num != person.getLevel()){
      System.out.println(name + " 未收治了病人 "+ person.getName() + "-----------移交其他科室医治");
      this.getNext().doSome(person);
    }else{
      System.out.println(name + " 收治了病人 "+ person.getName());
    }
  }

}

最后测试一下

public static void main(String[] args) {
    //定义责任链
    Pediatrics pediatrics = new Pediatrics();
    Orthopedics orthopedics = new Orthopedics();
    Neurology neurology = new Neurology();
    pediatrics.setNext(orthopedics);
    orthopedics.setNext(neurology);

    Person person1 = new Person();
    person1.setName("小明");
    person1.setLevel(2);
    Person person2 = new Person();
    person2.setName("小王");
    person2.setLevel(1);

    pediatrics.doSome(person1);
    pediatrics.doSome(person2);
  }

执行就可以看到结果

儿科 未收治了病人 小明-----------移交其他科室医治
骨科 未收治了病人 小明-----------移交其他科室医治
神经科 收治了病人 小明
儿科 未收治了病人 小王-----------移交其他科室医治
骨科 收治了病人 小王

5.优缺点

优点:

  1. 降低耦合度.它将请求的发送者和接收者解耦.
  2. 简化了对象.使得对象不需要知道链的结构.
  3. 增强给对象指派职责的灵活性.通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任.
  4. 增加新的请求处理类很方便.

缺点:

  1. 不能保证请求一定被接收.
  2. 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用.
  3. 可能不容易观察运行时的特征,有碍于除错.