最典型的就是击鼓传花了,一个传一个,等到适合的人接到。在程序里就是请求者不可以和多个接收者耦合在一起,将所有请求的处理者根据前一对象记住下一个对象的引用形成一条责任链,将请求沿着责任链传递,一直到负责处理请求的对象出现
责任链模式有三个角色,抽象处理者,具体处理者,客户类。抽象处理者定义一个处理请求的接口,包含处理方法和另一个链接。具体请求者实现该抽象方法,判断该方法是否可以处理,不能处理则传给后继者。客户类负责创建责任链,并向责任链的具体处理者发送请求,他不在乎处理链的传递和请求的细节处理过程
抽象处理者,包含下一个处理者的引用
abstract class Handler { private Handler next; public void setNext(Handler next) { this.next = next; } public Handler getNext() { return next; } public abstract void handleNumber(int number); }
具体处理者1
public class Handler1 extends Handler { @Override public void handleNumber(int number) { if(number<10){ System.out.println("1号处理"); }else{ if(getNext()!=null){ System.out.println("传给下一个处理"); getNext().handleNumber(number); }else System.out.println("没有人处理"); } } }
具体处理者2
public class Handler2 extends Handler { @Override public void handleNumber(int number) { if(number<100){ System.out.println("2号处理"); System.out.println(number); }else{ if(getNext()!=null){ System.out.println("传给下一个"); getNext().handleNumber(number); }else{ System.out.println("没有人处理该请求"); } } } }
测试类
public class Client { public static void main(String[] args) { Handler1 handler1 = new Handler1(); handler1.setNext(new Handler2()); handler1.handleNumber(100); } }
可以看出,每一个处理类都要设置下一个的责任链,如果一条责任链都没有对象可以处理该请求,就会返回无法处理的信息给请求者。
应用场景:有多个对象处理请求,但请求者不知道具体哪个对象处理的时候可以选择此模式,此模式还可以动态的添加动作链