Java使用责任链模式处理学生请假问题详解

本文实例讲述了Java使用责任链模式处理学生请假问题。分享给大家供大家参考,具体如下:

一. 模式定义

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

(1)抽象处理者角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回下家的引用。这个角色通常由一个Java抽象类或Java接口实现。

(2)具体处理角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。

二. 模式举例

1 模式分析

我们借用学生请假来说明这一模式

2 责任链模式静态类图

3 代码示例

3.1学生接口一IStudent

package com.demo.chain.message;
/**
 * 学生接口
 *
 * @author
 *
 */
public interface IStudent {
  /**
   * 获得学生病情状态
   *
   * 0:小事(班长就可以处理)
   *
   * 1:班长处理不了 老师能处理的事
   *
   * 2:老师处理不了 校长能处理的事
   *
   *
   */
  public int getState();
  /**
   * 获得学生请假消息
   *
   * @return
   */
  public String getRequestMessage();
}

3.2学生实现一Student

package com.demo.chain.message;
/**
 * 学生实现类
 *
 * @author
 *
 */
public class Student implements IStudent {
  // 病情的大小状态
  private int state = -1;
  // 请假消息
  private final String message;
  public Student(int state, String message) {
    this.state = state;
    this.message = message;
  }
  /**
   * 获得学生请假状态
   *
   * 0:小事(班长就可以处理)
   *
   * 1:班长处理不了 老师能处理的事
   *
   * 2:老师处理不了 校长能处理的事
   *
   *
   */
  public int getState() {
    return this.state;
  }
  /**
   * 获得学生请假消息
   *
   * @return
   */
  public String getRequestMessage() {
    return this.message;
  }
}

3.3抽象处理接口一IHandler

package com.demo.chain.handle;
import com.demo.chain.message.IStudent;
/**
 * 抽象处理者接口
 *
 * @author
 *
 */
public interface IHandler {
  // 处理请求
  public void handleRequest(IStudent student);
  // 设置下一个处理者
  public void setHandler(IHandler handler);
}

3.4抽象处理者一AbstractHandler

package com.demo.chain.handle;
import com.demo.chain.message.IStudent;
/**
 * 抽象处理者
 *
 * @author
 *
 */
public abstract class AbstractHandler implements IHandler {
  // 下一个处理者
  private IHandler handler;
  // 请假级别
  private int state = -1;
  // 构造方法 设置级别
  public AbstractHandler(int state) {
    this.state = state;
  }
  // 处理请求 交由子类负责进行具体的处理
  public abstract void process(IStudent student);
  // 处理请求
  public void handleRequest(IStudent student) {
    // 如果学生对象存在
    if (student != null) {
      if (this.state == student.getState()) {
        // 如果请假级别和当前一致 则当前对象进行处理
        this.process(student);
      } else {
        if (this.handler != null) {
          System.out.println("请求上级领导批复!");
          // 如果当前对象处理不了 则交给下一个处理者进行处理
          this.handler.handleRequest(student);
        }
      }
    }
  }
  // 设置下一个处理者
  public void setHandler(IHandler handler) {
    this.handler = handler;
  }
}

3.5班长一SquadLeaderHandler

package com.demo.chain.handle;
import com.demo.chain.message.IStudent;
/**
 * 抽象处理者
 *
 * @author
 *
 */
public abstract class AbstractHandler implements IHandler {
  // 下一个处理者
  private IHandler handler;
  // 请假级别
  private int state = -1;
  // 构造方法 设置级别
  public AbstractHandler(int state) {
    this.state = state;
  }
  // 处理请求 交由子类负责进行具体的处理
  public abstract void process(IStudent student);
  // 处理请求
  public void handleRequest(IStudent student) {
    // 如果学生对象存在
    if (student != null) {
      if (this.state == student.getState()) {
        // 如果请假级别和当前一致 则当前对象进行处理
        this.process(student);
      } else {
        if (this.handler != null) {
          System.out.println("请求上级领导批复!");
          // 如果当前对象处理不了 则交给下一个处理者进行处理
          this.handler.handleRequest(student);
        }
      }
    }
  }
  // 设置下一个处理者
  public void setHandler(IHandler handler) {
    this.handler = handler;
  }
}

3.6老师一TeacherHandler

package com.demo.chain.impl;
import com.demo.chain.handle.AbstractHandler;
import com.demo.chain.message.IStudent;
/**
 * 老师处理者
 *
 * @author
 *
 */
public class TeacherHandler extends AbstractHandler {
  public TeacherHandler() {
    super(1);
  }
  // 子类具体处理请求
  @Override
  public void process(IStudent student) {
    System.out.println("老师 批复:" + student.getRequestMessage());
  }
}

3.7校长一SchoolMasterHandler

package com.demo.chain.impl;
import com.demo.chain.handle.AbstractHandler;
import com.demo.chain.message.IStudent;
/**
 * 校长处理者
 *
 * @author
 *
 */
public class SchoolMasterHandler extends AbstractHandler {
  public SchoolMasterHandler() {
    super(2);
  }
  // 子类具体处理请求
  @Override
  public void process(IStudent student) {
    System.out.println("校长 批复:" + student.getRequestMessage());
  }
}

3.8外观类一ProcessHandler

package com.demo.chain.process;
import com.demo.chain.handle.IHandler;
import com.demo.chain.impl.SchoolMasterHandler;
import com.demo.chain.impl.SquadLeaderHandler;
import com.demo.chain.impl.TeacherHandler;
import com.demo.chain.message.IStudent;
/**
 * 设置责任链关联
 *
 * @author
 *
 */
public class ProcessHandler {
  // 班长处理者
  private final IHandler sqmshandler;
  // 老师处理者
  private final IHandler techhandler;
  // 校长处理者
  private final IHandler scmshandler;
  // 单例模式
  private static ProcessHandler processHandler = new ProcessHandler();
  /**
   * 构造方法建立请假处理责任链
   */
  private ProcessHandler() {
    // 创建处理对象
    // 班长
    this.sqmshandler = new SquadLeaderHandler();
    // 老师
    this.techhandler = new TeacherHandler();
    // 校长
    this.scmshandler = new SchoolMasterHandler();
    /**
     * 建立责任链
     */
    // 设置班长的下一个处理者:老师
    this.sqmshandler.setHandler(this.techhandler);
    // 设置老师的下一个处理者:校长
    this.techhandler.setHandler(this.scmshandler);
  }
  /**
   * 获得单例对象实例
   *
   * @return
   */
  public static ProcessHandler getInstance() {
    return processHandler;
  }
  /**
   * 发送请假请求
   *
   * @param message
   */
  public void sendMessage(IStudent student) {
    // 发送给第一个处理者:班长 处理
    this.sqmshandler.handleRequest(student);
  }
}

3.9客户端一Client

package com.demo;
import java.util.Random;
import com.demo.chain.message.IStudent;
import com.demo.chain.message.Student;
import com.demo.chain.process.ProcessHandler;
/**
 * 主应用程序
 *
 * @author
 *
 */
public class Client {
  /**
   * @param args
   */
  public static void main(String[] args) {
    // 获得外观对象
    ProcessHandler processHandler = ProcessHandler.getInstance();
    // 创建随机数对象 用来随机产生学生对象
    Random random = new Random();
    for (int i = 0; i < 3; i++) {
      // 获得随机数
      int radom = random.nextInt(3);
      IStudent student = new Student(radom, "学生" + i + "生病了,要请假!");
      System.out.println("#################################");
      // 处理消息
      processHandler.sendMessage(student);
      System.out.println("#################################\n");
    }
  }
}

4 运行结果

#################################
请求上级领导批复!
请求上级领导批复!
校长 批复:学生0生病了,要请假!
#################################
#################################
请求上级领导批复!
请求上级领导批复!
校长 批复:学生1生病了,要请假!
#################################
#################################
班长 批复:学生2生病了,要请假!
#################################

三. 该模式设计原则

1"开-闭"原则

2单一职责原则

四. 使用场合

(1)有多个对象处理同一请求,具体由哪一个来处理还不确定,只有在运行时才确定哪个对象处理的情况。
(2)消息具有多个接收者,而接收对象又是不明确的情况。只需要向其中的一个对象发出消息,由其内部具体处理。
(3)同一消息的多个处理对象可能会动态增加或减少,需要动态地指定的情况。

五. 责任链模式静态类图

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

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

您可能感兴趣的文章:

  • Java策略模式的简单应用实现方法
  • 对比Java设计模式编程中的状态模式和策略模式
  • Java设计模式之策略模式(Strategy模式)介绍
  • Java基于状态模式实现的文档编辑模式切换功能实例
  • Java使用观察者模式实现气象局高温预警功能示例
  • Java使用访问者模式解决公司层级结构图问题详解
  • Java基于代理模式解决红酒经销问题详解
  • Java基于命令模式实现邮局发信功能详解
  • Java使用备忘录模式实现过关类游戏功能详解
  • Java使用策略模式解决商场促销商品问题示例
(0)

相关推荐

  • Java基于代理模式解决红酒经销问题详解

    本文实例讲述了Java基于代理模式解决红酒经销问题.分享给大家供大家参考,具体如下: 一. 模式定义 在代理模式中,有两个对象参与处理同一请求,接收的请求由代理对象委托给真实对象处理,代理对象控制请求的访问,它在客户端应用程序与真实对象之间起到了一个中介桥梁的作用.代理模式使用对象聚合代替继承,有效地降低了软件模块之间的耦合度. 二. 模式举例 1 模式分析 我们借用红酒经销来说明这一模式. 2 代理模式静态类图 3 代码示例 3.1 红酒工厂接口一IRedWine package com.de

  • Java设计模式之策略模式(Strategy模式)介绍

    Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线,一个是框图(bar),这是两种算法,可以使用Strategy实现. 这里以字符串替代为例,有一个文件,我们需要读取后,希望替代其中相应的变量,然后输出.关于替代其中变量的方法可能有多种方法,这取决于用户的要求,所以我们要准备几套变量字符替代方案. 首先,我们建立一个抽象类RepTempRule 定义

  • Java使用策略模式解决商场促销商品问题示例

    本文实例讲述了Java使用策略模式解决商场促销商品问题.分享给大家供大家参考,具体如下: 一 模式定义 策略模式:定义一系列的算法,将每一种算法封装起来并可以相互替换使用,策略模式让算法独立于使用它的客户应用而独立变化. 二 模式举例 1 模式分析 我们借用商场促销商品来说明这一模式. 2 策略模式静态类图 3 代码示例 3.1 创建策略接口一IStrategy package com.demo.strategy; /** * 策略接口 * * @author * */ public inter

  • Java策略模式的简单应用实现方法

    在使用图像处理软件处理图片后,需要选择一种格式进行保存.然而各种格式在底层实现的算法并不相同,这刚好适合策略模式.编写程序,演示如何使用策略模式与简单工厂模式组合进行开发. 思路如下: 1.使用interface来定义一个接口,在该接口中定义save()方法:2.根据图片格式定义不同的类,分别在这些类中使用关键字implements实现接口:3.创建一个实现选择的类,在该类中定义实现选择的方法,该方法返回值为对应的图片保存类:4.在主方法中实现接口.代码如下: 复制代码 代码如下: public

  • Java使用访问者模式解决公司层级结构图问题详解

    本文实例讲述了Java使用访问者模式解决公司层级结构图问题.分享给大家供大家参考,具体如下: 一. 模式定义 访问者模式:是表示一个作用于某对象结构中各个元素的操作,它使用户可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二. 模式举例 1 模式分析 我们借用公司层级结构来说明这一模式. 2 访问者模式静态类图 3 代码示例 3.1 抽象员工一Staff package com.demo.structure; import com.demo.visitor.IVisitor; /**

  • Java基于状态模式实现的文档编辑模式切换功能实例

    本文实例讲述了Java基于状态模式实现的文档编辑模式切换功能.分享给大家供大家参考,具体如下: 一 模式定义 状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来就像是改变了其类. 二 模式举例 1 模式分析 我们借用文档编辑模式切换这一案例来说明这一模式. 2 状态模式静态类图 3 代码示例 3.1 创建状态接口一IState package com.demo.state; import com.demo.context.Context; /** * * 状态接口 * * @au

  • Java使用观察者模式实现气象局高温预警功能示例

    本文实例讲述了Java使用观察者模式实现气象局高温预警功能.分享给大家供大家参考,具体如下: 一.模式定义 观察者模式,又称为发布/订阅模式.观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 二.模式举例 1 模式分析 我们借用气象局高温预警来说明这一模式. 2 观察者模式静态类图 3 代码示例 3.1观察者接口一IObserver package com.demo.observer; import com.demo.subje

  • 对比Java设计模式编程中的状态模式和策略模式

    为了能在Java应用程序中正确的使用状态模式和策略模式,开发人员需要清楚地知道这两种模式之间的区别.尽管状态模式和策略模式的结构非常相似,它们又同样遵循开闭原则,都代表着SOLID设计原则的'O',但它们的意图是完全不同的.Java中的策略模式是对一组相关的算法进行封装,给调用方提供了运行时的灵活性.调用方可以在运行时选择不同的算法,而不用修改使用策略的那个Context类.使用策略模式的经典例子包括实现加密算法,压缩算法,以及排序算法.另一方面,状态模式使用一个对象可以在不同的状态下表现出不同

  • Java使用备忘录模式实现过关类游戏功能详解

    本文实例讲述了Java使用备忘录模式实现过关类游戏功能.分享给大家供大家参考,具体如下: 一.模式定义 备忘录模式,在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象外部保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 二.模式举例 1模式分析 我们借用过关类游戏来说明这一模式. 2备忘录模式静态类图 3代码示例(黑箱备忘录模式) 3.1创建备忘录窄接口一INarrowMemento package com.demo.memento; /** * 备忘录窄接口(不提供任何方法,外部

  • Java基于命令模式实现邮局发信功能详解

    本文实例讲述了Java基于命令模式实现邮局发信功能.分享给大家供大家参考,具体如下: 一. 模式定义 命令模式,将来自客户端的请求封建为一个对象,无须了解这个请求激活的动作或有关接受这个请求的处理细节.命令模式的根本目的在于将"请求者"与"实现者"之间解耦. 二. 模式举例 1 模式分析 我们借用邮局发信来说明这一模式. 2 命令模式静态类图 3 代码示例 3.1信件接收者接口一IReceiver package com.demo.receiver; /** * 信

随机推荐