`

职责链模式

 
阅读更多

[转载]java设计模式_职责链模式(带例子)

个人理解:COR模式除了要完成自己的功能外,还需要考虑当自己不能处理该request时,需要pass给下一个(这里的下一个其实是你指定的传入作为参数的handler)handler来处理。
 Servlet 中的Filter是使用该模式的,它在xml按顺序指定的每个filter实际就是像以下例子中为每个构造函数传入的handler参数,目的是在当前这个handler不能处理时会pass到下一个handler 也就是下个filter中去处理?
 
<!-- 正文开始 -->

                           Chain of Responsibility模式(职责链)
   Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Chain of Responsibility(职责链模式)模式便是其中一个.
   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);//sun ex:首先会在 HandlerStudent中处理该请求,但由于HandlerStudent是处理StudentReq的,所以该请求并没有被处理,它会根据在创建HandlerStudent对象时传入的参数是哪个handler来pass给那个handler来处理,比如这里应该是new HandlerTeacher 这个handler
    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

    参考&lt;大话设计模式&gt;,采用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