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

本文通过分析学生请假审批的例子,详细讲解了Java中的责任链模式。介绍了模式定义、角色、以及如何使用该模式处理学生请假请求。通过创建班长、老师和校长的处理者对象,形成责任链,请求在链上逐级传递,直至找到合适的处理者。最后展示了运行结果和模式设计原则,以及适用场景。
摘要由CSDN通过智能技术生成

一模式定义

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

(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值