1、概述:

  职责链就是上下级各个部门连接成了一条链,当一个请求沿着这个链往上走的时候,当某一个链接点满足该请求的处理要求的时候,就会处理该请求,否则继续往上传,这在日常生活的比较常见,比如,一个员工请假,先是提交给组长,组长再提交给部门主任,部门主任在提交给部门经理等等,一级一级的网上提交。

2、定义:

  使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连接成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

3、UML类图:

 

4、好处:

  接收者和发送者都没有对方的明确信息,且链中的对象自己也不知道链的结构,结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需要它所有的候选接受者的引用,大大降低了耦合度。

5、示例代码:

  下面一个部门请假的为例:

  管理者类:

  abstract class Manager//抽象管理者类

  {

    protected Manager superior;//管理者的上一级

 

    public void SetSuperior(Manage superior)

    {

      this.superior=superior;

    }

    abstract public void RequestApplication(Request request);//请求满足条件处理,不满足请求往上级传

  }

  //经理

  class CommonManager:Manager

  {

    public override  void RequestApplication(Request request)

    {

      if(request.Number<=2)

      {

        ///处理请假

      }

      else

      {

        if(superior !=null)

          superior.RequestApplication(request);//往上级传

      }

    }

  }

  //总监类

  class Majordomo:Manager

  {

    public override void RequestApplication(Request request)

    {

      if(request.Number <= 5)

      {

        /// 处理请假

      }

      else

      {

         if(superior !=null)

          superior.RequestApplication(request);

      }

    }

  }

   class GeneralManager:Manager//总经理级别,职责链的最后一个连接点,请求传到这里,一定要处理,否则就没法处理了

  {

      public override void RequestApplication(Request request)

    {

      if(request.Number>5)

      {

          ///处理请假 

      }

    }

  }

客户端:

  Manager jinli=new CommonManage();//经理

  Majordomo zongjian =new Majordomo();//总监

  GeneralManager zongjingli =new GeneralManager();//总经理

  jinli.SetSuperior(zongjian);//设置经理上级

  zongjian.SetSuperior(zongjingli);

 

  Request request =new Request();

  request.Number =4;

  jinli.RequestApplication(request);

posted on 2013-08-26 10:07  Kelly_HanShuai  阅读(123)  评论(0)    收藏  举报