设计模式(十六):行为型之责任链模式
设计模式(十六):行为型之责任链模式
一、设计模式分类创建型模式 用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”提供了单例、原型、工厂方法、抽象工厂、建造者 5 种创建型模式结构型模式 用于描述如何将类或对象按某种布局组成更大的结构提供了代理、适配器、桥接、装饰、外观、享元、组合 7 种结构型模式行为型模式 用于描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的任
设计模式(十六):行为型之责任链模式
- 创建型模式
- 用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”
- 提供了单例、原型、工厂方法、抽象工厂、建造者
5 种创建型模式
- 结构型模式
- 用于描述如何将类或对象按某种布局组成更大的结构
- 提供了代理、适配器、桥接、装饰、外观、享元、组合
7 种结构型模式
- 行为型模式
- 用于描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,以及怎样分配职责
- 提供了模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器
11 种行为型模式
1、概述
- 一个请求有多个对象可以处理,但每个对象的处理条件或权限不同
- 例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等
- 但每个领导能批准的天数不同,员工必须根据自己要请假的天数去不同的领导签名
- 也就是说员工必须记住每个领导的姓名、电话和地址等信息,这增加了难度
定义
- 为了避免
请求发送者
与多个请求处理者
耦合在一起 - 将所有请求的处理者通过前一对象记住其
下一个对象的引用
而连成一条链 - 当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止
2、结构
职责链模式主要包含以下角:
- 抽象处理者(Handler)角:定义一个处理请求的接口,包含抽象处理方法和一个后继连接
- 具体处理者(Concrete Handler)角:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者
- 客户类(Client)角:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程
、实现
现需要开发一个请假流程控制系统
- 请假
一天
以下的假只需要小组长
同意即可 - 请假
1天到天
的假还需要部门经理
同意 - 请求
天到7天
还需要总经理
同意才行
类图如下:
代码如下:
- 请假条类
@Getter
@AllArgsCtructor
public class LeaveRequest {
//姓名
private String name;
//请假天数
private int num;
//请假内容
private String content;
}
- 抽象处理者类
public abstract class Handler {
protected final static int UM_OE = 1;
protected final static int UM_THREE = ;
protected final static int UM_SEVE = 7;
// 该领导处理的请求天数区间
private int numStart;
private int numEnd;
// 声明后续者(声明上级领导)
private Handler nextHandler;
public Handler(int numStart) {
= numStart;
}
public Handler(int numStart, int numEnd) {
= numStart;
= numEnd;
}
// 设置上级领导对象
public void setextHandler(Handler nextHandler) {
= nextHandler;
}
// 各级领导处理请求条的方法
protected abstract void handleLeave(LeaveRequest leave);
// 提交请求条
public final void submit(LeaveRequest leave) {
// 该领导进行审批
this.handleLeave(leave);
// 如果还有上级 并且请假天数超过了当前领导的处理范围
if ( != null && leave.getum() > ) {
// 提交给上级领导进行审批
.submit(leave);
} else {
println("流程结束!");
}
}
}
- 具体处理者
//小组长
public class GroupLeader extends Handler {
public GroupLeader() {
//小组长处理1-天的请假
super(Handler.UM_OE, Handler.UM_THREE);
}
@Override
protected void handleLeave(LeaveRequest leave) {
println(leave.getame() + "请假" + leave.getum() + "天," + leave.getContent() + "。");
println("小组长审批:同意。");
}
}
//部门经理
public class Manager extends Handler {
public Manager() {
//部门经理处理-7天的请假
super(Handler.UM_THREE, Handler.UM_SEVE);
}
@Override
protected void handleLeave(LeaveRequest leave) {
println(leave.getame() + "请假" + leave.getum() + "天," + leave.getContent() + "。");
println("部门经理审批:同意。");
}
}
//总经理
public class GeneralManager extends Handler {
public GeneralManager() {
//部门经理处理7天以上的请假
super(Handler.UM_SEVE);
}
@Override
protected void handleLeave(LeaveRequest leave) {
println(leave.getame() + "请假" + leave.getum() + "天," + leave.getContent() + "。");
println("总经理审批:同意。");
}
}
- 客户端测试类
public class Client {
public static void main(String[] args) {
//请假条来一张
LeaveRequest leave = new LeaveRequest("小花",5,"身体不适");
//各位领导
GroupLeader groupLeader = new GroupLeader();
Manager manager = new Manager();
GeneralManager generalManager = new GeneralManager();
groupLeader.setextHandler(manager);//小组长的领导是部门经理
manager.setextHandler(generalManager);//部门经理的领导是总经理
//提交申请
groupLeader.submit(leave);
}
}
4、优缺点
优点
- 模式降低了
请求发送者
和接收者
的耦合度 - 增强了系统的可扩展性,可以根据需要增加新的请求处理类,
满足开闭原则
- 增强了给对象指派职责的灵活性,当工作流程发生变化,可以动态地改变链内的成员或者修改它们的次序,也可动态地新增或者删除责任
- 每个类只需要处理自己该处理的工作,不能处理的传递给下一个对象完成,明确各类的责任范围,
符合类的单一职责原则
缺点
- 对比较长的职责链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响
- 职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性
- 可能会由于职责链的错误设置而导致系统出错,如可能会造成循环调用
5、源码解析
- 在javaWeb应用开发中,FilterChain是职责链(过滤器)模式的典型应用
以下是Filter的模拟实现分析:
- 模拟web请求Request以及web响应Respe
public interface Request{
}
public interface Respe{
}
- 模拟web过滤器Filter
public interface Filter {
public void doFilter(Request req,Respe res,FilterChain c);
}
- 模拟实现具体过滤器
public class FirstFilter implements Filter {
@Override
public void doFilter(Request request, Respe respe, FilterChain chain) {
println("过滤器1 前置处理");
// 先执行所有前置处理再倒序执行所有后置处理
chain.doFilter(request, respe);
println("过滤器1 后置处理");
}
}
public class SecondFilter implements Filter {
@Override
public void doFilter(Request request, Respe respe, FilterChain chain) {
println("过滤器2 前置处理");
// 先执行所有前置处理再倒序执行所有后置处理
chain.doFilter(request, respe);
println("过滤器2 后置处理");
}
}
- 模拟实现过滤器链FilterChain
public class FilterChain {
private List<Filter> filters = new ArrayList<Filter>();
private int index = 0;
// 链式调用
public FilterChain addFilter(Filter filter) {
this.filters.add(filter);
return this;
}
public void doFilter(Request request, Respe respe) {
if (index == filters.size()) {
return;
}
Filter filter = filters.get(index);
index++;
filter.doFilter(request, respe, this);
}
}
- 测试类
public class Client {
public static void main(String[] args) {
Request req = null;
Respe res = null ;
FilterChain filterChain = new FilterChain();
filterChain.addFilter(new FirstFilter()).addFilter(new SecondFilter());
filterChain.doFilter(req,res);
}
}
输出结果:
过滤器1 前置处理
过滤器2 前置处理
过滤器2 后置处理
过滤器1 后置处理
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:202-06-26,如有侵权请联系 cloudcommunity@tencent 删除客户端设计模式public测试对象 #感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上传时间: 2025-07-20 17:30:00
推荐阅读
留言与评论(共有 11 条评论) |
本站网友 伦紫玄 | 14分钟前 发表 |
respe | |
本站网友 亲爱的英文单词 | 30分钟前 发表 |
"); } }客户端测试类代码语言:javascript代码运行次数:0运行复制public class Client { public static void main(String[] args) { //请假条来一张 LeaveRequest leave = new LeaveRequest("小花" | |
本站网友 马来酸氯苯那敏 | 0秒前 发表 |
可将请求沿着这条链传递 | |
本站网友 国家法规数据库 | 23分钟前 发表 |
组合 7 种结构型模式行为型模式 用于描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务 | |
本站网友 航天晨光股票 | 23分钟前 发表 |
增加了客户端的复杂性可能会由于职责链的错误设置而导致系统出错 | |
本站网友 菜鸟裹裹快递查询 | 27分钟前 发表 |
可将请求沿着这条链传递 | |
本站网友 煅瓦楞子 | 21分钟前 发表 |
享元 | |
本站网友 怎样美白 | 15分钟前 发表 |
总经理等 但每个领导能批准的天数不同 | |
本站网友 网站日志 | 10分钟前 发表 |
Respe respe) { if (index == filters.size()) { return; } Filter filter = filters.get(index); index++; filter.doFilter(request | |
本站网友 梅河 | 17分钟前 发表 |
"); } } //部门经理 public class Manager extends Handler { public Manager() { //部门经理处理-7天的请假 super(Handler.UM_THREE |