`
安卓干货铺
  • 浏览: 36402 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

设计模式(9)-责任链模式详解(易懂)

阅读更多

责任链模式的定义

责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

模型:

  • Hander:抽象处理者

  • ConcreteHander:具体处理者

下面模型代码如下:

1.设计等级类

 

public class Level {
   private  int level=1;


   public  Level(int level){
       this.level=level;
   }

   public int getLevel() {
       return level;
   }
}

2.请求类

public class MyRequest {

   Level level;
   public  MyRequest(Level level){
       this.level=level;
   }
   public int  getLevel(){

       return level.getLevel();
   }

}

3.响应类

public class Response {
   private String message;
   public Response(String message) {
       Log.d("qzs","处理完成");
       this.message = message;
   }
   public String getMessage() {
       return message;
   }
}

4.抽象处理者类

public abstract class AbstractHandler  {
   //判断下一个处理者是谁
   private AbstractHandler nextHandler = null;

   public final Response handlerRequest(MyRequest request) {
       Response response = null;

       if(this.getHandlerLevel()==request.getLevel()) {
           response = this.response(request);
       }else {
           if(this.nextHandler != null) {
               Log.d("qzs","转到下一个处理者中...");
               response = this.nextHandler.handlerRequest(request);
           }else {
          Log.d("qzs","后面没有处理请求了...");
           }
       }
       return response;
   }
   public void setNextHandler(AbstractHandler handler) {
       nextHandler = handler;
   }
   //拿到等级
   protected abstract int getHandlerLevel();
   //响应
   protected abstract Response response(MyRequest request);
}

5.定义具体的处理者,这里就定义了两个:

public class ConcreteHandlerA extends AbstractHandler {
   @Override
   protected int getHandlerLevel() {
       return 0;
   }

   @Override
   protected Response response(MyRequest request) {
       Log.d("qzs","正在处理中“ConcreteHandlerA");
       return new Response("响应处理结果A") ;
   }
}


public class ConcreteHandlerB extends AbstractHandler {
   @Override
   protected int getHandlerLevel() {
       return 1;
   }

   @Override
   protected Response response(MyRequest request) {
       Log.d("qzs","正在处理中“ConcreteHandlerB");
       return new Response("响应处理结果B") ;
   }
}

6.调用:

前提是A到B组成了一个链,并且上面A的等级是0,B是1;发出的请求先经过A如果不能处理就交给B:

       AbstractHandler handler1=new ConcreteHandlerA();
       AbstractHandler handler2=new ConcreteHandlerB();
       //A到B组成一个链
       handler1.setNextHandler(handler2);
       Response response=handler1.handlerRequest(new MyRequest(new Level(1)));

上面代码我传送的等级是1,结果应该是由B解决的,下面是运行结果:

 

如果你传入的等级不在A和B的范围,运行结果如下:

说明没有适合的了。

实例说明

如果上面的定义不是很明白,下面直接实例说明一下。

例子:家里的小孩想出去玩,需要请示一下,这里规定一级请示爸爸,爸爸同意了就可以出去玩了;如果爸爸不在家就请示(二级)妈妈,妈妈同意了也可以出去玩;如果都不在家就不允许出去玩。

1.编写等级类,响应类,请求类,这些都没有变化可以直接去上面看就可以了。

2.抽象处理类:

public abstract class AbstractHandler  {
   //判断下一个处理者是谁
   private AbstractHandler nextHandler = null;

   public final Response handlerRequest(MyRequest request) {
       Response response = null;

       if(this.getHandlerLevel()==request.getLevel()) {
           response = this.response(request);
       }else {
           if(this.nextHandler != null) {
               Log.d("qzs","转到下一个处理者中...");
               response = this.nextHandler.handlerRequest(request);
           }else {
          Log.d("qzs","爸爸妈妈不在家...");
           }
       }
       return response;
   }
   public void setNextHandler(AbstractHandler handler) {
       nextHandler = handler;
   }
   //拿到等级
   protected abstract int getHandlerLevel();
   //响应
   protected abstract Response response(MyRequest request);
}

 

3.具体处理者,也就是爸爸和妈妈:

public class Father extends AbstractHandler {
   @Override
   protected int getHandlerLevel() {
       return 1;
   }

   @Override
   protected Response response(MyRequest request) {
       Log.d("qzs","正在处理中“Father”");
       Log.d("qzs","爸爸同意孩子出去玩了");
       return  new Response("") ;
   }
}

public class Mother extends  AbstractHandler{
   @Override
   protected int getHandlerLevel() {
       return 2;
   }

   @Override
   protected Response response(MyRequest request) {
       Log.d("qzs","正在处理中“Mother”");
       Log.d("qzs","妈妈同意孩子出去玩了");
       return new Response("") ;
   }
}

 

4.调用

如果传入的等级1:

       AbstractHandler handler1=new Father();
       AbstractHandler handler2=new Mother();
       //先问爸爸,爸爸不在家再问妈妈
       handler1.setNextHandler(handler2);
       Response response=handler1.handlerRequest(new MyRequest(new Level(1)));

运行结果:

传入其他的等级也可以,这个大家可以自己去试一试。

责任链模式的优缺点及其他

1.优点

  • 耦合度降低,请求和处理是分开的

2.缺点

  • 责任链太长或者每条链判断处理的时间太长会影响性能。特别是递归循环的时候

  • 不一定被处理,每个职责类的职责很明确,这就需要对写默认的处理了

责任链模式重要的两点:分离职责,动态组合

本文部分定义参考了网上博文和网上信息...

0
2
分享到:
评论

相关推荐

    java多线程设计模式详解(PDF及源码)

    本书浅显易懂的介绍了JAVA线程相关的设计模式,通过程序范例和UML图示来一一解说,书中代码的重要部分加了标注以使读者更加容易理解,再加上图文并茂,对于初学者还是程序设计高手来说,这都是一本学习和认识JAVA...

    23种设计模式(通俗易懂篇)

    ### 23种设计模式(通俗易懂篇) #### 创建型模式 1. **Factory(工厂模式)** - **应用场景**:当你需要为用户提供多种选择时,例如选择不同的餐厅来满足不同用户对食物的偏好。 - **原理**:在工厂模式中,...

    java设计模式的 3本书 1 ppt

    最后,"23种设计模式详解.ppt"可能是一个包含幻灯片形式的教程,它可能以简洁明了的方式展示了23种设计模式,每种模式的关键点、示例代码和应用场景可能都有所提及,对于快速回顾或教学来说非常方便。 通过阅读这些...

    英文原版的设计模式详解,Patterns in C 2, STATE

    "状态机设计模式详解" 在程序设计中,状态机是一种非常重要的概念。状态机是指程序在其生命周期内经过的一系列状态的抽象表示。今天,我们来讨论状态机的设计模式,特别是使用C语言实现状态机的策略。 传统的解决...

    设计模式_简单易懂的例子,且很有意思

    ### 设计模式详解 设计模式是在软件开发过程中针对常见的问题所总结出来的最佳实践,它能够帮助开发者更加高效地解决问题,并提高代码的复用性、扩展性和维护性。本篇文章将重点介绍四种常用的设计模式:策略模式、...

    node.js 设计模式 英文版

    3. **设计模式详解**: - 深入分析各种设计模式,如工厂模式、单例模式、装饰者模式等,并探讨它们在Node.js中的应用场景。 - 通过实例展示如何在实际项目中应用这些模式来解决问题。 4. **构建模块化和可扩展的...

    java与模式-清晰书签版

    《Java与模式-清晰书签版》是一份包含多种Java设计模式详解的资源包,旨在帮助开发者深入理解和应用设计模式。这份资源集成了多种格式的文档,包括详细的文本描述、图表解析以及实际代码示例,使得学习过程更加直观...

    java设计模式-单例.pdf

    ### Java设计模式——单例模式详解 #### 一、单例模式概述 单例模式是设计模式中的一个重要组成部分,属于创建型模式之一。其主要作用是确保某个类仅有一个实例存在,并提供一个全局访问该实例的方法。这在很多场景...

    java多线程设计模式详解part2

    多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍JAVA线程相关的设计模式概念,并且通过实际的JAVA程序范例和UML图示来一一解说,书中有代码的重要部分加上标注使读者更加容易...

    java多线程设计模式详解part1

    多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍JAVA线程相关的设计模式概念,并且通过实际的JAVA程序范例和UML图示来一一解说,书中有代码的重要部分加上标注使读者更加容易...

    深入浅出的设计模式

    在本书中,"HEAD_FIRST设计模式(中文版)"采用了易懂且生动的方式,将复杂的概念以图文并茂的形式呈现,使得读者能够更轻松地理解和掌握设计模式。以下是对几个关键设计模式的详解: 1. **工厂模式**:它是创建型...

    Java多线程设计模式详解

    书中不仅通过浅显易懂的文字和实例介绍了这些模式,还提供了丰富的UML图示和代码示例,以帮助读者更深入地理解每个设计模式的运用和实现。此外,本书还包括了Java线程基础内容的介绍、附录内容以及对每个设计模式的...

    小学生也能看懂的!!!编程小白必看:23种设计模式轻松入门!详解(全23种).zip

    本文以通俗易懂的语言,详细介绍了23种设计模式。通过比喻和简单的例子,解释了每种设计模式的工作原理和用途,旨在帮助初学者理解并应用这些模式,以提高代码的质量和可维护性。 **适用人群**: 这篇文章适合编程...

    java多线程设计模式详解

    本书浅显易懂的介绍了JAVA线程相关的设计模式,通过程序范例和UML图示来一一解说,书中代码的重要部分加了标注以使读者更加容易理解,再加上图文并茂,对于初学者还是程序设计高手来说,这都是一本学习和认识JAVA...

    设计模式面试题.pdf

    - **责任链模式**:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 - **命令模式**:将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化;对请求排队或记录请求日志...

    参考资料-详解差模电压和共模电压-简单易懂.zip

    在电子工程领域,差模电压和共模电压是两种重要的概念,主要应用于...在实际工作中,通过阅读"详解差模电压和共模电压-简单易懂.pdf"这份参考资料,可以深入学习这两个概念,掌握它们在电路设计中的应用和应对策略。

Global site tag (gtag.js) - Google Analytics