一模式定义
在责任链模式中,很多对象由每一个对象对其下家的引用而连接起来,形成一条链。客户端应用请求在这个链上进行传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪个对象最终处理这个请求,这使系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
(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)同一消息的多个处理对象可能会动态增加或减少,需要动态地指定的情况。
五责任链模式静态类图
相关推荐
《Oracle数据库课程设计——学生考勤系统的Oracle实现》是一份详细的报告,主要涵盖了设计和实现一个基于Oracle数据库的学生考勤管理系统的过程。这份报告的核心在于利用Oracle数据库技术来满足高校学生考勤管理的...
《基于SSM+JSP的学生请假系统:深度解析与实践》 在当今信息化时代,教育领域的管理系统已经成为不可或缺的一部分。本文将深入探讨一个基于SSM(Spring、SpringMVC、MyBatis)框架和JSP(JavaServer Pages)技术...
本系统——“基于SSM+MySQL的高校学生请假管理系统”旨在为高校提供一个便捷、规范的请假流程,从而优化学校日常管理工作。下面我们将详细探讨该系统的核心技术和实现方式。 一、技术栈介绍 1. SSM框架:SSM是...
本项目——学生请假系统,正是在此背景下产生的。它旨在通过软件手段来提高学校管理层对学生请假信息的处理效率,减少人工干预带来的错误和不便,同时保证数据的安全性。 #### 二、技术栈介绍 1. **SSM框架**: -...
该项目旨在解决传统学生请假流程中存在的诸多问题,如流程繁琐、审批效率低、信息不透明等,并通过采用现代化的信息技术手段——Spring Boot框架和MySQL数据库,来构建一个高效、便捷的学生请假管理系统。...
本文将探讨一个重要的应用实例——基于Java的在线学生请假管理系统,它旨在解决传统学生请假流程中的繁琐问题,提升管理效率。 首先,我们需要了解在线学生请假管理系统的研究现状。当前,传统的纸质请假流程已无法...
《学生信息管理系统——基于JSP与Servlet的实现详解》 在信息技术领域,开发Web应用程序是常见的任务之一,其中,学生信息管理系统是一个典型的案例。本文将深入探讨如何利用JSP(JavaServer Pages)和Servlet技术...
《学生考勤管理系统详解——基于JSP+Servlet的MVC实现》 学生考勤管理系统是教育信息化领域中常见的一种应用,它集成了考勤管理与请假管理两大核心功能,为教师和管理员提供了一种便捷的方式来追踪和管理学生的出勤...
《数据库课程设计——班级事务管理系统》 在信息技术领域,数据库设计是构建高效、稳定的信息系统的基础。本课程设计旨在通过创建一个班级事务管理系统,让学生掌握数据库设计的基本流程和方法,包括需求分析、概念...
4. **架构**:B/S(Browser/Server)和MVC(Model-View-Controller)模式——B/S架构便于用户访问,MVC架构有助于代码的组织和维护。 5. **开发环境**: - IDEA:一款高效的Java集成开发环境。 - JDK1.8:提供Java...
综上所述,这份2021年的最新幼儿园管理档案——校车接送学生点名表,是幼儿园日常运营中对学生安全和出勤管理的核心工具,通过科学的管理方式,确保每一位学生的安全,提升家园沟通效率,同时也体现出幼儿园对于规范...
随着高等教育规模的不断扩大,传统的学生信息管理模式——即依赖人工管理学生信息的方式——已经暴露出诸多不足之处。这种方式不仅工作效率低下,而且文件保密性差,长期积累下来会产生大量的文件和数据,导致查找、...
本毕业设计项目——“学生考勤信息管理系统”,就是利用了JSP(Java Server Pages)和Servlet技术,结合SQL数据库,构建了一个高效、便捷的考勤信息处理平台,旨在提高教育管理的效率,减少人为错误。 一、系统架构...
- “基石”——《生命——女生部职能、制度、文化》:强调部门的基本理念和运作模式。 - “主题”——《灵魂——女生部常规活动风采》:展现部门活动的精彩瞬间。 - “品牌”——《色彩——女生部贴心小报、形象...
《学生信息管理系统——JavaWeb课程设计详解》 在信息技术领域,学生信息管理系统是常见的应用案例,它主要用于管理和处理教育机构中的学生数据。本系统采用JavaWeb技术进行开发,结合数据库管理,实现对学籍信息、...