Java责任链模式定义与用法分析

本文实例讲述了Java责任链模式定义与用法。分享给大家供大家参考,具体如下:

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

责任链模式主要包括以下几个角色

1、处理者:处理者是一个接口,负责规定具体处理者处理用户请求的方法以及具体处理者设置后继处理对象的方法

2、具体处理者:具体处理者是实现处理接口的类的实例,具体处理者通过调用处理接口规定的方法处理用户的请求,既在接到用户的请求后,处理者将调用接口规定的方法,在执行该方法的过程中,如果发现能处理用户的请求,就处理用户的请求。如果发现处理不了就交给下一个处理者进行处理。

例如一个图书检索的程序,根据图书类别将图书分为了N个种类,然后创建若干个种类的对象,每个对象对一个种类进行检索。为了能更好的管理这些对象,可以将这额对象组织成一个责任链,当用户需要鉴定书籍时,系统可以让责任链上的第一个对象来处理用户的请求,这个对象首先检索自己是否能够处理用户的请求,如果能处理就反馈并返回处理内容。如果不能处理则交给下一个处理对象进行处理。

package org.zhy.design.demo;
/**
 * 处理接口
 * @author zhengyi
 *
 */
public interface Handler {
  //根据书的ID进行检索
  public abstract void Search(int id);
  //下一个处理者 参数为实现处理接口的实现类
  public abstract void nextHandler(Handler han);
}
package org.zhy.design.demo;
import java.util.ArrayList;
import java.util.List;
/**
 * 文学类的书籍检索
 * @author zhengyi
 *
 */
public class WenXue implements Handler{
  private Handler han;//下一个处理者
  private List<Integer> list; //模拟文学类书籍的编号
  public WenXue(){
    list=new ArrayList<Integer>();
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(4);
    list.add(5);
  }
  @Override
  public void nextHandler(Handler han) {
    this.han=han; //给下一个处理者赋值
  }
  @Override
  public void Search(int id) {
    if(list.contains(id)){ //检索list中是否存在此ID的书籍,如果存在则打印
      System.out.println("恭喜您,您检索的书籍是文学类的");
    }else{ //如果没有此书籍则交给下一个处理者进行处理
      if(han!=null){
        han.Search(id);
      }
    }
  }
}
package org.zhy.design.demo;
import java.util.ArrayList;
import java.util.List;
/**
 * 计算机类的书籍
 * @author zhengyi
 *
 */
public class JiSuanJi implements Handler {
  private Handler han;
  private List<Integer> list;
  public JiSuanJi(){
    list=new ArrayList<Integer>();
    list.add(6);
    list.add(7);
    list.add(8);
    list.add(9);
    list.add(10);
  }
  @Override
  public void nextHandler(Handler han) {
    this.han=han;
  }
  @Override
  public void Search(int id) {
    if(list.contains(id)){
      System.out.println("恭喜你,此书记在计算机类");
    }else{
      if(han!=null){
        han.Search(id);
      }
    }
  }
}
package org.zhy.design.demo;
public class Appliction {
  private Handler jisuanji,wenxue;
  public void createHandler(){
    jisuanji=new JiSuanJi();
    wenxue=new WenXue();
    jisuanji.nextHandler(wenxue); //指定下一个处理者
  }
  public void search(int id){
    jisuanji.Search(id); //第一个处理者进行筛选处理
  }
  public static void main(String[] args) {
    Appliction app=new Appliction();
    app.createHandler();
    app.search(10);
  }
}

适合使用责任链模式的情况

1、在许多对象可以处理用户请求的时候

2、希望用户不必明确处理者的时候,同时向多个处理者发送请求

3、程序希望动态的订制可处理用户请求的集合对象

更多java相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • Java多线程中的单例模式两种实现方式

    Java多线程中的单例模式 一.在多线程环境下创建单例 方式一: package com.ietree.multithread.sync; public class Singletion { private static class InnerSingletion { private static Singletion single = new Singletion(); } public static Singletion getInstance() { return InnerSinglet

  • java 单例模式和工厂模式实例详解

    单例模式根据实例化对象时机的不同分为两种:一种是饿汉式单例,一种是懒汉式单例. 私有的构造方法 指向自己实例的私有静态引用 以自己实例为返回值的静态的公有的方法 饿汉式单例 public class Singleton { private static Singleton singleton = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return singleton; } } 懒

  • JAVA多线程并发下的单例模式应用

    单例模式应该是设计模式中比较简单的一个,也是非常常见的,但是在多线程并发的环境下使用却是不那么简单了,今天给大家分享一个我在开发过程中遇到的单例模式的应用. 首先我们先来看一下单例模式的定义: 一个类有且仅有一个实例,并且自行实例化向整个系统提供. 单例模式的要素: 1.私有的静态的实例对象 2.私有的构造函数(保证在该类外部,无法通过new的方式来创建对象实例) 3.公有的.静态的.访问该实例对象的方法 单例模式分为懒汉形和饿汉式 懒汉式: 应用刚启动的时候,并不创建实例,当外部调用该类的实例

  • Java多线程模式之Balking模式详解

    本文实例讲述了Java多线程模式之Balking模式.分享给大家供大家参考,具体如下: 当现在不适合这个操作,或是没有必要进行这个操作时就直接放弃这个操作而回去.这个就是Balking模式 例如王某在餐厅吃饭,当王某需要点餐时喊服务员需要点餐.当服务员A和B都注意到了王某点餐的示意,这时服务员B看到服务员A已经去响应了王某的点餐请求,所以服务员B就不会再过去响应王某的点餐请求. 程序示例: 程序的需求是模拟一个自动保存的功能.自动保存是为了预防计算机忽然断电或则软件突然出错的危险,定期将数据保存

  • Java适配器模式定义与用法示例

    本文实例讲述了Java适配器模式定义与用法.分享给大家供大家参考,具体如下: 将一个类的接口转换成客户想要的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 适配器一共包括3种角色 1.目标:目标是一个接口,该接口是客户想使用的接口 2.被适配者:被适配者是一个已存在的接口或抽象类,这个接口或抽象类需要适配 3.适配器:适配器是一个类,该类实现了目标接口并包含有被适配者的引用,即适配者的指着是对被适配者接口与目标进行适配 package org.zhy.adapte

  • Java单利模式与多线程总结归纳

    概念: java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功能.每台计算机可以有若干个打印机,但只能有一个Printer

  • java多线程之线程安全的单例模式

    概念: java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功能.每台计算机可以有若干个打印机,但只能有一个Printer

  • Java中Builder模式的实现详解

    前言 本文主要给大家介绍了关于如何实现Builder模式,大家在构建大对象时,对象的属性比较多,我们可以采用一个构造器或者使用空的构造器构造,然后使用setter方法去设置.在使用者使用这些方法时,会很多冗长的构造器参数列表或者setter方法.我们可以使用Builder模式来简化大对象的构造,提高代码的简洁性,同时提高使用者的编码体验. 下面我们将介绍在Java8之前.使用极简代码利器Lombok.Java8之后的Builder模式. Pre Java8 我们先来看下在Java8之前的Buil

  • java 迭代器模式实例详解

    java 迭代器模式实例详解 今天来818设计模式中的迭代器模式,也是java中Stack,List,Set等接口以及数组这个数据结构都会使用的一种模式. 首先,为什么使用迭代器模式,目的就是通过一个通用的迭代方法,隐藏stack,list,set以及数组中不同的遍历细节.也就是说,我不想让那些调用我的遍历容器的方法的人知道我到底是怎么一个一个的获取这些元素的(stack的pop,list的get,数组的array[i]),我只想让他知道他能 通过一个迭代器Iterator或者通过一个for e

  • Java多线程下的单例模式参考

    单例有多种的写法,本例是懒汉式单例的一种写法.在高并发环境下需要注意的是: 1.单例在并发访问并调用其相应的getInstance方法的时候也会造成创建多个实例对象,加锁是必要的. 2.使用synchronized是比较好的解决方案,优点是代码简洁,缺点是在抛出异常的时候不能处理维护使系统处于良好状态. 3.显示的lock设定是良好的解决方案. 使用lock的代码如下: package demo; import java.util.concurrent.locks.Lock; import ja

  • Java代理模式详细解析

    代理模式是我们比较常用的设计模式之一.其中新思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象.这些额外的操作通常需要与实际对象进行通信,代理模式一般涉及到的角色有: 抽象角色:声明真实对象和代理对象的共同接口: 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象.同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装. 真实角色:代理角色所代表的真实对象,

  • 详解java 单例模式及方法总结

    java设计模式--单例模式  单例设计模式 Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点. 核心知识点如下: (1) 将采用单例设计模式的类的构造方法私有化(采用private修饰). (2) 在其内部产生该类的实例化对象,并将其封装成private static类型. (3) 定义一个静态方法返回该类的实例. /** * 方法一 * 单例模式的实现:饿汉式,线程安全 但效率比较低 */ pu

随机推荐