责任链模式

责任链模式

定义

       定义多个责任对象,每个对象负责不同的业务职责,将这些对象连成一条链,并沿着这条链传递请求,知道有一个对象处理它(或者每个对象都处理一遍)为止。

 

类图:

 

纯责任链:严格来讲,一个纯的责任链是“每次只有一个对象有机会来处理某个请求”。可以用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());

    }

 

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值