`
men4661273
  • 浏览: 278244 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java设计模式-Chain of Responsibility(责任者链)模式

    博客分类:
  • java
阅读更多
Chain of Responsibility定义
  Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递request. 也就是说,来了一个请求,A类先处理,如果没有处理,就传递到B类处理,如果没有处理,就传递到C类处理,就这样象一个链条(chain)一样传递下去。
  
  如何使用?
  虽然这一段是如何使用CoR,但是也是演示什么是CoR.
  
  有一个Handler接口:
  
  public interface Handler{
    public void handleRequest();
  }
  
  这是一个处理request的事例, 如果有多种request,比如 请求帮助 请求打印 或请求格式化:
  
  最先想到的解决方案是:在接口中增加多个请求:
  public interface Handler{
    public void handleHelp();
    public void handlePrint();
    public void handleFormat();
  
  }
  
  具体是一段实现接口Handler代码:
  public class ConcreteHandler implements Handler{
    private Handler successor;
  
    public ConcreteHandler(Handler successor){
    this.successor=successor;
  }
  
    public void handleHelp(){
      //具体处理请求Help的代码
      ...
    }
  
    public void handlePrint(){
      //如果是print 转去处理Print
      successor.handlePrint();
    }
    public void handleFormat(){
      //如果是Format 转去处理format
      successor.handleFormat();
    }
  
  }
  
  一共有三个这样的具体实现类,上面是处理help,还有处理Print 处理Format这大概是我们最常用的编程思路。
  
  虽然思路简单明了,但是有一个扩展问题,如果我们需要再增加一个请求request种类,需要修改接口及其每一个实现。
  
  第二方案:将每种request都变成一个接口,因此我们有以下代码 :
  
  public interface HelpHandler{
    public void handleHelp();
  }
  
  public interface PrintHandler{
    public void handlePrint();
  }
  
  public interface FormatHandler{
    public void handleFormat();
  }
  
  public class ConcreteHandler
    implements HelpHandler,PrintHandler,FormatHandlet{
    private HelpHandler helpSuccessor;
    private PrintHandler printSuccessor;
    private FormatHandler formatSuccessor;
  
    public ConcreteHandler(HelpHandler helpSuccessor,PrintHandler printSuccessor,FormatHandler formatSuccessor)
    {
      this.helpSuccessor=helpSuccessor;
      this.printSuccessor=printSuccessor;
      this.formatSuccessor=formatSuccessor;
    }
  
    public void handleHelp(){
      .......
    }
  
    public void handlePrint(){this.printSuccessor=printSuccessor;}
  
    public void handleFormat(){this.formatSuccessor=formatSuccessor;}
  
  }
  
  这个办法在增加新的请求request情况下,只是节省了接口的修改量,接口实现ConcreteHandler还需要修改。而且代码显然不简单美丽。
  
  解决方案3: 在Handler接口中只使用一个参数化方法:
  public interface Handler{
    public void handleRequest(String request);
  }
  那么Handler实现代码如下:
  public class ConcreteHandler implements Handler{
    private Handler successor;
  
    public ConcreteHandler(Handler successor){
      this.successor=successor;
    }
  
    public void handleRequest(String request){
      if (request.equals("Help")){
        //这里是处理Help的具体代码
      }else
        //传递到下一个
        successor.handle(request);
  
      }
    }
  
  }
  
  这里先假设request是String类型,如果不是怎么办?当然我们可以创建一个专门类Request
  
  最后解决方案:接口Handler的代码如下:
  public interface Handler{
    public void handleRequest(Request request);
  }
  Request类的定义:
  public class Request{
    private String type;
  
    public Request(String type){this.type=type;}
  
    public String getType(){return type;}
  
    public void execute(){
      //request真正具体行为代码
    }
  }
  
  那么Handler实现代码如下:
  public class ConcreteHandler implements Handler{
    private Handler successor;
  
    public ConcreteHandler(Handler successor){
      this.successor=successor;
    }
  
    public void handleRequest(Request request){
      if (request instanceof HelpRequest){
        //这里是处理Help的具体代码
      }else if (request instanceof PrintRequst){
        request.execute();
      }else
        //传递到下一个
        successor.handle(request);
  
      }
    }
  
  }
  
  这个解决方案就是CoR, 在一个链上,都有相应职责的类,因此叫Chain of Responsibility.



  
  CoR的优点:
  因为无法预知来自外界的请求是属于哪种类型,每个类如果碰到它不能处理的请求只要放弃就可以。无疑这降低了类之间的耦合性。
  
  缺点是效率低,因为一个请求的完成可能要遍历到最后才可能完成,当然也可以用树的概念优化。 在Java AWT1.0中,对于鼠标按键事情的处理就是使用CoR,到Java.1.1以后,就使用Observer代替CoR
  
  扩展性差,因为在CoR中,一定要有一个统一的接口Handler.局限性就在这里。




参考 http://java.chinaitlab.com/model/20537.html
  • 大小: 40.6 KB
分享到:
评论

相关推荐

    chain-of-responsibility-demo 责任链模式demo

    责任链模式是一种行为设计模式,它允许我们向多个对象中的一个发送请求,而无需知道哪个对象会处理这个请求。在责任链模式中,接收者和发送者之间没有直接的耦合,请求会在一系列对象(链)中传递,直到某个对象处理...

    java设计模式---诙谐易懂版

    代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法...责任链模式(Chain of Responsibility Pattern)、访问者模式(Visitor Pattern)、状态模式(State Pattern)、原型模式(Prototype Pattern...

    c++-设计模式之责任链模式(Chain of Responsibility Pattern)

    责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许将请求的发送者和接收者解耦。通过将请求沿着处理链传递,直到有对象处理该请求为止,这种模式避免了请求发送者与具体处理者之间的紧...

    Chain of Responsibility模式

    Chain of Responsibility模式可以与其他设计模式结合使用,如装饰器模式来增强处理者的能力,或者与策略模式结合,使处理策略可配置。此外,模式也可以应用于异步处理场景,如消息队列中的消息处理流程。 总之,...

    【Java设计模式】(3)责任链Chain of Responsibility

    **Java设计模式——责任链(Chain of Responsibility)** 在软件工程中,设计模式是一种解决常见问题的可重用解决方案。责任链模式是行为设计模式之一,它的主要思想是将请求的发送者和接收者解耦,通过将多个处理...

    【Java设计模式-源码】责任链模式:构建强大的请求处理机制

    在 Java 开发中,责任链模式是一种重要的行为设计模式,它可以解耦请求的发送者和接收者,使多个对象都有机会处理请求。本文将详细介绍责任链模式的意图、解释、编程示例、适用场景、实际应用、优点和权衡。同时,还...

    JAVA设计模式-chm版

    包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式...

    java设计模式之责任链(chain of responsibility)

    责任链(Chain of Responsibility)模式是一种行为设计模式,它允许我们向对象链中传递请求,让每个对象决定是否处理这个请求。在Java中,这种模式常用于事件处理、日志系统或者权限控制等场景,其核心思想是将处理...

    设计模式C++学习之责任链模式(Chain of Responsibility)

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

    c++设计模式-行为型模式-责任链模式

    责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递...

    04-Chain Of Responsibility.rar

    责任链模式是一种行为设计模式,它允许将请求沿着处理者链进行发送,每个处理者都可以选择处理请求或将其传递给链中的下一个处理者。这种模式使得系统可以灵活地添加、删除或改变处理者,而无需硬编码具体的调用关系...

    Java设计模式--责任链模式.docx

    责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它使你能在不明确指定接收者的情况下,将请求沿着处理者对象的链式结构进行传递。每个处理者对象都包含对下一个处理者的引用,如果某个处理者...

    JAVA设计模式--入门

    1. 责任链模式(Chain of Responsibility):将请求沿链传递,直到某个对象处理。 2. 命令模式(Command):将命令封装为对象,以便于参数化不同请求,支持队列和日志记录。 3. 解释器模式(Interpreter):定义语言...

    C#面向对象设计模式纵横谈(20):(行为型模式) Chain Of Responsibility 职责链模式

    职责链模式(Chain of Responsibility)是一种行为型设计模式,它允许将请求沿着处理者对象的链进行传递,直到某个对象能够处理这个请求。在C#中,职责链模式的应用可以帮助我们构建灵活、可扩展的系统,减少对象...

    JAVA设计模式之行为模式 责任链模式和状态模式

    本篇将探讨两种重要的行为设计模式:责任链模式(Chain of Responsibility Pattern)和状态模式(State Pattern)。 **责任链模式**是一种使多个对象都有机会处理请求的模式,避免请求发送者与接收者之间的耦合。在...

    java 设计模式-个人总结

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

    Chain Of Responsibility模式

    Chain of Responsibility(责任链)模式是一种行为设计模式,它允许将请求沿着处理者对象的链进行发送,每个对象都可以处理请求或将其传递给链中的下一个对象。这种模式常用于事件处理或者命令的执行流程,使得多个...

    JAVA设计模式之行为模式

    这是JAVA设计模式中属于行为模式的部分,包括Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor...

    JAVA design pattern-java设计模式

    如命令(Command)、解释器(Interpreter)、迭代器(Iterator)、中介者(Mediator)、备忘录(Memento)、观察者(Observer)、状态(State)、策略(Strategy)、模板方法(Template Method)、访问者(Visitor)...

    Java设计模式之责任链模式(Chain of Responsibility模式)介绍

    责任链模式(Chain of Responsibility,CoR)是一种行为设计模式,它允许将请求沿着处理者对象的链式结构进行传递,直到某个对象处理这个请求。每个处理者对象都包含对下一个处理者的引用,如果当前处理者无法处理...

Global site tag (gtag.js) - Google Analytics