责任链模式
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链检查该请求,并对其进行处理,或者将它传递给下一个对象。
责任链模式有两个角色组成:
抽象处理者角色:它定义了一个处理请求的接口。当然对于链子的不同实现,也可以在这个角色中实现后继链。
具体处理者角色:实现抽象处理者定义的接口,并处理它所负责的请求。
下面是《设计模式》中给出的适用范围:
1) 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。 2) 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。 3) 可处理一个请求的对象集合应被动态指定。责任链模式又有纯与不纯的区别。
纯的责任链模式,规定一个具体处理者角色只能对请求作出两种动作:自己处理;传给下家。不能出现处理了一部分,把剩下的传给了下家的情况。而且请求在责任链中必须被处理,而不能出现无果而终的结局。反之,则就是不纯的责任链模式。
在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。
/** * 持有下一个处理请求的对象 */ public abstract class Handler { protected Handler handler; /** * 具体处理方法 */ protected abstract int handler(int num); public Handler getHandler() { return handler; } /** * 设置下一个处理请求的对象 */ public void setHandler(Handler handler){ this.handler = handler; } } |
public class AuditHandler extends Handler{ @Override protected int handler(int num) { num++; System.out.println("audit......"+ num); return getHandler().handler(num); } } |
public class CleanHandler extends Handler{ @Override protected int handler(int num) { num++; System.out.println("clean......"+ num); return getHandler().handler(num); } } |
public class MatchHandler extends Handler{ @Override protected int handler(int num) { num++; System.out.println("match......"+ num); return num; } } |
public class Client { public static void main(String[] args) { Handler audit = new AuditHandler(); Handler clean = new CleanHandler(); Handler match = new MatchHandler(); audit.setHandler(clean); clean.setHandler(match); audit.handler(0); } } |
参考资料:《深入浅出设计模式》
《Head First 设计模式》