设计模式--责任链模式
设计模式--责任链模式
1 概述
1.1 定义
责任链模式(Chain of Responsibility Design)使多个对象都有机会处理请求,从而避免了请求的发送者与接受者之间的耦合关系。将这些对象连城一条链,并沿着这条链传递该请求,直到有对象处理它为止。
责任链模式把处理者与被处理者分隔开,彼此都不知道其具体的实现,实现了处理者与被处理者间的解耦。
1.2 应用
Java Web中的Filter就是责任链变现形式,只是稍微变形了一下。
Java中的异常处理就很像这种思想:抛出异常-->处理异常/向上抛异常-->处理异常/向上抛异常-->....直到处理该异常或者抛给console。
1.3 类图
责任链模式涉及的角色如下:
- Handler处理者抽象角色:定义处理者的基本方法:处理方法、设置下一个处理者方法等
- Handler处理者具体角色:具体的处理者
2 详解
1 public abstract class Handler { 2 // 下一个处理者 3 private Handler nextHandler; 4 5 // 每个处理者对请求做出处理 6 public final void handle(String str) { 7 // 根据条件判断是否由自己处理 8 if(condition) { 9 concreteHandle(str); 10 } 11 // 不属于自己处理,交由下一个处理者处理 12 if(nextHandler != null) { 13 nextHandler.handle(str); 14 } else { 15 return; 16 } 17 } 18 19 // 设置下一个处理者 20 public void setNext(Handler handler) { 21 this.nextHandler = handler; 22 } 23 24 // 具体的处理 25 public abstract void concreteHandle(String str); 26 } 27 28 public class ConcreteHandler1 extends Handler { 29 @Override 30 public void concreteHandle(String str) { 31 System.out.println("ConcreteHandler1 handle " + str); 32 } 33 } 34 35 public class ConcreteHandler2 extends Handler { 36 @Override 37 public void concreteHandle(String str) { 38 System.out.println("ConcreteHandle handle " + str); 39 } 40 } 41 42 public class Client { 43 public static void main(String[] args) { 44 // 声明所有处理者 45 Handler handler1 = new ConcreteHandler1(); 46 Handler handler2 = new ConcreteHandler2(); 47 // 设置处理链顺序 48 handler1.setNext(handler2); 49 // 处理 50 handler1.handle("hello"); 51 } 52 }