职责链模式

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

图如下:

chain

UML很简单,让我们先来看一个简单的例子。

四. 职责链模式应用之请假管理

请假这个事情,相信每个人都不陌生。

我们公司是个相对很宽松的公司。

在公司里,如果你的请假时间小于0.5天,那么只需要向项目经理打声招呼就OK了。

如果超过了0.5天,但是还小于2天,那么就要去找人事部处理,当然,这就要扣工资了。

如果超过了2天,你就需要去找总经理了,工资当然也玩完了。

那么,对于我们来说,这个流程就是这样的。

image

也就是这样一个过程,你需要和你的直接上级——项目经理去打交道,最终可能是项目经理给你回邮件,可能是人事部给你回邮件,也可能是总经理给你回邮件。内部的过程其实应该是个黑盒子,你并不知道内部的消息是如何处理的。你需要找到的,只是你想要第一个交付的对象而已。

无标题

   Chain of Responsibility(CoR)职责链模式,CoR模式是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递request. 也就是说,来了一个请求,A类先处理,如果没有处理,就传递到B类处理,如果没有处理,就传递到C类处理,就这样象一个链条(chain)一样传递下去。

   优点: 因为无法预知来自外界(客户端)的请求是属于哪种类型,每个类如果碰到它不能处理的请求只要放弃就可以。

   缺点: 缺点是效率低,因为一个请求的完成可能要遍历到最后才可能完成;扩展性差,因为在CoR中,一定要有一个统一的接口Handler.局限性就在这里.

  

   在此写了10个java类来描述说明Chain of Responsibility设计模式的实现方式;

  1、 Handler.java    请求处理类接口

  2、 HandlerStudent.java  学生请求处理类

  3、 HandlerTeacher.java  老师请求处理类

  4、 HandlerSchoolmaster.java 校长请求处理类

  5、 Request.java    请求类接口

  6、 RequestStudent.java  学生请求类

  7、 RequestTeacher.java  老师请求类

  8、 RequestSchoolmaster.java 校长请求类

  9、 RequestPresident.java  总统请求类

  10、TestCoR.java    带有main方法的测试类

 

===============   1、 Handler.java

package cor;

public interface Handler {

  public void handleRequest(Request request);

}

===============  1 end

 

===============   2、 HandlerStudent.java

package cor;

public class HandlerStudent implements Handler {

  //下一个Handler对象

  private Handler nextSuccessor;

 

  public HandlerStudent(Handler nextSuccessor) {

    this.nextSuccessor = nextSuccessor;

  }

  public void handleRequest(Request request) {

    //处理 StudentRequest

    if(request.getType().equalsIgnoreCase("StudentRequest")){

      System.out.println("HandlerStudent begin to response StudentRequest;");

      request.execute();

    //把请求传递给其它受理者

    }else{

      if(this.nextSuccessor != null){

        nextSuccessor.handleRequest(request);

      }else{

        System.out.println("request[" + request.getType() + "] has not handler to deal!");

      }

    }

  }

}

===============   2 end

 

===============   3、 HandlerTeacher.java

package cor;

public class HandlerTeacher implements Handler {

  //下一个Handler对象

  private Handler nextSuccessor;

 

  public HandlerTeacher(Handler nextSuccessor) {

    this.nextSuccessor = nextSuccessor;

  }

  public void handleRequest(Request request) {

    //处理 TeacherRequest

    if(request.getType().equalsIgnoreCase("TeacherRequest")){

      System.out.println("HandlerTeacher begin to response StudentRequest;");

      request.execute();

    //把请求传递给其它受理者

    }else{

      if(this.nextSuccessor != null){

        nextSuccessor.handleRequest(request);

      }else{

        System.out.println("request[" + request.getType() + "] has not handler to deal!");

      }

    }

  }

}

===============   3 end

 

===============   4、 HandlerSchoolmaster.java

package cor;

public class HandlerSchoolmaster implements Handler {

  //下一个Handler对象

  private Handler nextSuccessor;

 

  public HandlerSchoolmaster(Handler nextSuccessor) {

    this.nextSuccessor = nextSuccessor;

  }

  public void handleRequest(Request request) {

    //处理 SchoolmasterRequest

    if(request.getType().equalsIgnoreCase("SchoolmasterRequest")){

      System.out.println("HandlerSchoolmaster begin to response StudentRequest;");

      request.execute();

    //把请求传递给其它受理者

    }else{

      if(this.nextSuccessor != null){

        nextSuccessor.handleRequest(request);

      }else{

        System.out.println("request[" + request.getType() + "] has not handler to deal!");

      }

    }

  }

}

===============   4 end

 

===============   5、 Request.java

package cor;

public interface Request {

  //请求类型

  public String getType();

  //执行任务

  public void execute();

}

===============   5 end

 

===============   6、 RequestStudent.java

package cor;

public class RequestStudent implements Request {

  public void execute() {

    System.out.println("[RequestStudent] :t Students request has been accepted!");

  }

  public String getType() {

    return "StudentRequest";

  }

}

===============   6 end

 

===============   7、 RequestTeacher.java

package cor;

public class RequestTeacher implements Request {

  public void execute() {

    System.out.println("[RequestTeacher] :t Teachers request has been accepted!");

  }

  public String getType() {

    return "TeacherRequest";

  }

}

===============   7 end

 

===============   8、 RequestSchoolmaster.java

package cor;

public class RequestSchoolmaster implements Request {

  public void execute() {

    System.out.println("[RequestSchoolmaster] :t Schoolmasters request has been accepted!");

  }

  public String getType() {

    return "SchoolmasterRequest";

  }

}

===============   8 end

 

===============   9、 RequestPresident.java

package cor;

public class RequestPresident implements Request {

  public void execute() {

    System.out.println("[RequestPresident] :t Presidents request has been accepted!");

  }

  public String getType() {

    return "PresidentRequest";

  }

}

===============   9 end

 

===============   10、 TestCoR.java

package cor;

public class TestCoR {

  public static void main(String[] args) {

    Handler handler = new HandlerStudent(new HandlerTeacher(new HandlerSchoolmaster(null)));

   

    Request studentReq = new RequestStudent();

    Request teacherReq = new RequestTeacher();

    Request schoolmasterReq = new RequestSchoolmaster();

    Request presidentReq = new RequestPresident();

   

    //传入student request

    handler.handleRequest(studentReq);

    System.out.println("-----------");

    //传入teacher request

    handler.handleRequest(teacherReq);

    System.out.println("-----------");

    //传入schoolmaster request

    handler.handleRequest(schoolmasterReq);

    System.out.println("-----------");

    //传入president request

    handler.handleRequest(presidentReq);

    System.out.println("-----------");

  }

}

===============   10 end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值