责任链模式
定义
定义多个责任对象,每个对象负责不同的业务职责,将这些对象连成一条链,并沿着这条链传递请求,知道有一个对象处理它(或者每个对象都处理一遍)为止。
类图:
纯责任链:严格来讲,一个纯的责任链是“每次只有一个对象有机会来处理某个请求”。可以用if-else来描述,纯的责任链一定是if-else if-else if-…else..这种结构。也就是说,对于每个责任对象,要么你能完全负起责任,要么你完全做不来就什么都不要做,把责任推给下家(即走elseif分支),直到最后,总有一个人来负责(最后的else)。
不纯责任链:不纯的责任链适用范围更广,一般都是每个责任链对象处理一部分责任,可以是责任的增强、校验(如interceptor),环境对象的过滤(如filter)等等。更类似于if-if-if-if的结构。这样一来可能第一个if只处理了部分责任,再交给由第二个if处理,每条责任对象都会经过一遍。
优劣:
优点:
1. 接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需要保持一个指向其后继者的引用,而不需要保持它所有的候选接收者的引用,降低耦合度。
2. 客户端来组装责任链,对于现在spring的灵活度来说非常方便,经常可以在spring配置中进行bean的组装即可。
缺点:
1. 责任链不保证必有一个责任对象能处理请求,有可能整条链到最后都没有对请求做任何处理。
实例:
Context:上下文对象,在每个责任链对象中传递
/** * Created by IntelliJ IDEA. * User: yingkuohao * Date: 14-1-23 * Time: 上午10:46 * CopyRight:360buy * Descrption: 环境对象,这里就持有一个map,简单模拟一下 * To change this template use File | Settings | File Templates. */ public class Context {
private Map<String, String> map = new HashMap<String, String>();
public Map<String, String> getMap() { return map; }
public void setMap(Map<String, String> map) { this.map = map; } } |
BaseHandler:抽象责任对象
public abstract class BaseHandler {
protected BaseHandler nextHandler; //持有下一个handler
public abstract void doRequest(Context context); //抽象方法,不同的责任链对象处理不同的业务
public BaseHandler getNextHandler() { return nextHandler; }
public void setNextHandler(BaseHandler nextHandler) { this.nextHandler = nextHandler; } } |
LeaderHandler:主管责任对象
public class LeaderHandler extends BaseHandler { @Override public void doRequest(Context context) { dosth(context); if(this.getNextHandler()!=null) { this.getNextHandler().doRequest(context); } }
private void dosth(Context context) { System.out.println("leader审核通过!"); context.getMap().put("leader","leader审核通过"); } } |
ManagerHandler:部门经理责任对象
public class ManagerHandler extends BaseHandler { @Override public void doRequest(Context context) { dosth(context); if(this.getNextHandler()!=null) { this.getNextHandler().doRequest(context); } }
private void dosth(Context context) { System.out.println("manager审核通过!"); context.getMap().put("manager","manager审核通过"); } } |
DirectorHandler:总监责任对象
public class DirectorHandler extends BaseHandler{ @Override public void doRequest(Context context) { dosth(context); if(this.getNextHandler()!=null) { this.getNextHandler().doRequest(context); } }
private void dosth(Context context) { System.out.println("director审核通过!"); context.getMap().put("director","director审核通过"); } } |
Client:客户端对象,组装责任链对象,形成一条链
public class Client {
public static void main(String args[]) { BaseHandler leaderHandler =new LeaderHandler(); BaseHandler managerHandler =new ManagerHandler(); BaseHandler directorHandler =new DirectorHandler();
leaderHandler.setNextHandler(managerHandler); managerHandler.setNextHandler(directorHandler);
Context context=new Context(); leaderHandler.doRequest(context); System.out.println(context.getMap().toString()); }
} |