本文实例讲述了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与模式》一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理
16.4 纯与不纯的职责链模式 职责链模式可分为纯的职责链模式和不纯的职责链模式两种: (1) 纯的职责链模式 一个纯的职责链模式要求一个具体处理者对象只能在两个行为中选择一个:要么承担全部责任,要么将责任推给下家,不允许出现某一个具体处理者对象在承担了一部分或全部责任后又将责任向下传递的情况。而且在纯的职责链模式中,要求一个请求必须被某一个处理者对象所接收,不能出现某个请求未被
16.3 完整解决方案 为了让采购单的审批流程更加灵活,并实现采购单的链式传递和处理,Sunny公司开发人员使用职责链模式来实现采购单的分级审批,其基本结构如图16-3所示: 在图16-3中,抽象类Approver充当抽象处理者(抽象传递者),Director、VicePresident、President和Congress充当具体处理者(具体传递者),PurchaseRequest
16.2 职责链模式概述 很多情况下,在一个软件系统中可以处理某个请求的对象不止一个,例如SCM系统中的采购单审批,主任、副董事长、董事长和董事会都可以处理采购单,他们可以构成一条处理采购单的链式结构,采购单沿着这条链进行传递,这条链就称为职责链。职责链可以是一条直线、一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求。链上的每一个对象都是请求处理者,职责链模式可以将请求
“一对二”,“过”,“过”……这声音熟悉吗?你会想到什么?对!纸牌。在类似“斗地主”这样的纸牌游戏中,某人出牌给他的下家,下家看看手中的牌,如果要不起上家的牌则将出牌请求再转发给他的下家,其下家再进行判断。一个循环下来,如果其他人都要不起该牌,则最初的出牌者可以打出新的牌。在这个过程中,牌作为一个请求沿着一条链在传递,每一位纸牌的玩家都可以处理该请求。在设计模式中,我们也有一种专门用于处理这种请求
主要内容:介绍,实现,AbstractLogger.java,ConsoleLogger.java,ErrorLogger.java,FileLogger.java,ChainPatternDemo.java顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求