`

职责链模式

 
阅读更多

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

图如下:

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

分享到:
评论

相关推荐

    设计模式之职责链模式(ChainOfResponsibilityPattern)

    职责链模式(ChainOfResponsibilityPattern)是一种行为设计模式,主要目的是通过建立一个处理请求的对象链,使得请求可以在链上的各个对象间传递,直到被某个对象处理。这种模式可以有效地解耦请求发起者和处理者,...

    设计模式 - 职责链模式(C++实例)

    职责链模式(Chain of Responsibility)是一种行为设计模式,它的核心思想是将一系列处理请求的对象组织成一条链,每个对象都包含对请求的处理或传递的责任。在C++中实现职责链模式,我们可以创建一个抽象处理器类,...

    职责链模式模型代码

    职责链模式(Chain of Responsibility)是一种行为设计模式,它允许我们沿着对象链传递请求,让每个对象决定是否处理这个请求,或者将请求传递给链中的下一个对象。在C#中,我们可以利用类和接口来实现这种模式。让...

    第17章_职责链模式.ppt

    【职责链模式】是行为型模式的一种,其主要动机是解耦请求的发送者和处理者。在职责链中,多个对象可以接收并处理同一个请求,这些对象形成一条链,请求沿着链传递,直到某个对象负责处理。这种方式减少了对象间的...

    设计模式:职责链模式

    职责链模式(Chain of Responsibility)是设计模式中的一种行为模式,它允许将请求沿着处理者对象的链式结构进行传递,直到某个对象决定处理这个请求。这种模式的主要优点在于可以解耦发送者和接收者,使得系统更加...

    职责链模式--python

    参考<大话设计模式>,采用python书写的模板类。职责链模式。

    Java 23种设计模式17职责链模式.pdf

    ### Java设计模式详解:职责链模式 #### 行为型模式概述 行为型设计模式着重于定义对象间的职责分配及算法的抽象化。不同于结构型模式关注类和对象的组合,行为型模式更注重对象之间的交互与职责划分,强调的是在...

    职责链模式-基本代码.rar_C#_职责链模式

    职责链模式是一种设计模式,它允许我们沿着一个对象链来传递请求,每个对象都可以处理请求,也可以将请求传递给链中的下一个对象。这种模式在处理事件流或责任分发时非常有用,它使得代码更加灵活,降低了耦合度。在...

    职责链模式PPT带源码

    职责链模式是一种行为设计模式,它允许我们定义一系列对象,这些对象可以按顺序处理请求,形成一条职责链。每个对象都是链上的一个节点,负责处理特定类型的请求或将其传递给链中的下一个对象。这种模式使得我们可以...

    职责链模式代码示例

    职责链模式是一种设计模式,它允许我们把请求沿着处理者对象的链条传递,直到某个对象决定处理这个请求。这种模式可以避免请求发送者与接收者之间的耦合,使得系统更具有弹性,因为添加新的处理者或者改变现有处理者...

    设计模式-职责链模式(讲解及其实现代码)

    职责链模式是一种行为设计模式,它允许我们定义一系列对象,这些对象可以按顺序接收请求,每个对象都可以处理请求或将其传递给链中的下一个对象。这种模式使得我们可以将请求的发送者与接收者解耦,同时增加了系统...

    (行为型模式) Chain Of Responsibility 职责链模式

    ### (行为型模式) Chain Of Responsibility 职责链模式 #### 李建忠 jianzhong.lee@gmail.com #### 设计模式论坛: forum.softcompass.com #### 上海祝成科技高级培训讲师 www.softcompass.com #### 请求的发送者...

    Objective C职责链模式设计源码

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

    24职责链模式.zip

    职责链模式是一种设计模式,它在软件工程中用于处理请求的传递和处理。这个模式的主要思想是将多个处理对象组织成一个链条,每个对象都包含对请求的一部分处理能力。当一个请求进入系统时,它会沿着这个链进行传递,...

    201626705063梁艳萍职责链模式.pptx

    ### 201626705063梁艳萍职责链模式.pptx 知识点解析 #### 一、职责链模式简介 职责链模式是一种行为设计模式,其核心思想在于通过构建一系列处理对象并将这些对象串联成一条链路,使得一个请求可以在该链路上依次...

    设计模式之职责链模式

    设计模式之职责链模式,这份文档以例子的形式讲诉了设计模式之职责链模式,希望可以帮助需要的人!

    第十九讲:职责链模式

    职责链模式(Chain of Responsibility Pattern)是一种行为设计模式,它使你能在不指定接收者的情况下,将请求沿着处理者链进行发送。每个处理者都包含对下一个处理者的引用,允许请求在链中传递,直到被某个处理者...

    职责链模式的结构优化

    职责链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将请求沿着处理者对象的链进行传递,直到某个对象处理该请求。这种模式的主要优点是解耦了发送者和接收者,使得系统更加灵活,可以动态...

    职责链模式.cpp职责链模式的实现

    职责链模式.cpp职责链模式的实现

Global site tag (gtag.js) - Google Analytics