责任链模式
当某个请求或事件,有多个对象都有可能处理它,但是不确定具体是谁,顺序怎样。 此时如果让请求自己去一一寻找这些对象,无疑增加了复杂度和耦合度。
责任链模式的定义:为了避免请求发送者 与 多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
如Struts2 的拦截器、JSP 和 Servlet 的 Filter 等,所有这些,都可以考虑使用责任链模式来实现。 拦截后能处理就处理,不能处理交给下一个。
角色:
抽象处理者: 包含抽象处理方法 和 一个后继处理者连接
具体处理者: 实现抽象处理者,判断能否处理当前请求? 如不能,交给后继者
客户类角色:创建处理链,并向链头的具体处理者对象提交请求
适用: 收银台针在计算不同维度的活动和优惠券时,有先后顺序和不同的处理方式(现在写了很多个if)
过程:
//抽象处理者角色 abstract class Handler { private Handler next; public void setNext(Handler next) { this.next = next; } public Handler getNext() { return next; } //处理请求的方法 public abstract void handleRequest(String request); } //具体处理者角色1 class ConcreteHandler1 extends Handler { public void handleRequest(String request) { if (request.equals("one")) { System.out.println("具体处理者1负责处理该请求!"); } else { if (getNext() != null) { getNext().handleRequest(request); } else { System.out.println("没有人处理该请求!"); } } } } //具体处理者角色2 class ConcreteHandler2 extends Handler { public void handleRequest(String request) { if (request.equals("two")) { System.out.println("具体处理者2负责处理该请求!"); } else { if (getNext() != null) { getNext().handleRequest(request); } else { System.out.println("没有人处理该请求!"); } } } } public static void main(String[] args) { //组装责任链 Handler handler1 = new ConcreteHandler1(); Handler handler2 = new ConcreteHandler2(); handler1.setNext(handler2); //提交请求 handler1.handleRequest("two"); }