java责任链模式审批请假_责任链模式——学生请假

一模式定义

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

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

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

二模式举例

1模式分析

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

dffb661a8b1b9492176434ee28d15cce.png

2责任链模式静态类图

9f02ffa5c21d318ba90a5ab5a798ff8b.png

3代码示例

3.1学生接口一IStudent

Java代码  e276d7cb82235c70fe4e77198e1f34f6.png

package com.demo.chain.message;

/**

* 学生接口

*

* @author

*

*/

public interface IStudent {

/**

* 获得学生病情状态

*

* 0:小事(班长就可以处理)

*

* 1:班长处理不了 老师能处理的事

*

* 2:老师处理不了 校长能处理的事

*

*

*/

public int getState();

/**

* 获得学生请假消息

*

* @return

*/

public String getRequestMessage();

}

3.2学生实现一Student

Java代码  e276d7cb82235c70fe4e77198e1f34f6.png

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

Java代码  e276d7cb82235c70fe4e77198e1f34f6.png

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

Java代码  e276d7cb82235c70fe4e77198e1f34f6.png

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

Java代码  e276d7cb82235c70fe4e77198e1f34f6.png

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

Java代码  e276d7cb82235c70fe4e77198e1f34f6.png

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

Java代码  e276d7cb82235c70fe4e77198e1f34f6.png

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

Java代码  e276d7cb82235c70fe4e77198e1f34f6.png

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

Java代码  e276d7cb82235c70fe4e77198e1f34f6.png

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 

// 获得随机数

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)同一消息的多个处理对象可能会动态增加或减少,需要动态地指定的情况。

五责任链模式静态类图

1261682b856631177a37756481350139.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值