职责链模式 / 责任链模式
基本介绍
1.一个抽象类公开定义了执行它的方法的方式/模板,它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行
2.通常每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推
角色
1.Handler:抽象处理者,定义了一个处理请求的方法,聚合另外一个 Handler(下一个具体处理者),依赖 Request
(1)一般通过在 Handler 中设置一个最大节点数量,在 setNext 方法中判断是否已经超过阀值,超过则不允许该链建立,避免出现超长链无意识地破坏系统性能
2.ConcreteHandler:具体处理者,处理自己负责的请求,同时可以访问它的后继者(即下一个处理者);如果可以处理请求,则进行处理,否则交给后继者去处理,从而形成一个职责链
3.Request:含复数属性,表示一个请求
事项
1.优点
(1)降低耦合度,将请求的发送者和接收者解耦
(2)简化对象,使得对象不需要知道链的结构
(3)增强给对象指派职责的灵活性,通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任
(4)方便增加新的请求处理类
2.缺点
(1)不能保证请求一定被接收
(2)责任链比较长的时,系统性能将受到一定影响因此需控制链中最大节点数量
(3)类似递归,不容易观察运行时的特征,代码调试复杂
3.应用场景
(1)有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定
(2)在不明确指定接收者的情况下,向多个对象中的一个提交一个请求
(3)可动态指定一组对象处理请求
代码示例
public class Client {//客户端
public static void main(String[] args) {
Request request = new Request();
request.setLevel(3);
HandlerLevel1 handlerLevel1 = new HandlerLevel1();
HandlerLevel2 handlerLevel2 = new HandlerLevel2();
HandlerLevel3 handlerLevel3 = new HandlerLevel3();
handlerLevel1.setNextHandler(handlerLevel2);
handlerLevel2.setNextHandler(handlerLevel3);
handlerLevel1.processRequest(request);
}
}
class Request {//请求类
private int level;//请求等级
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
}
abstract class AbstractHandler {
protected AbstractHandler nextHandler;//下一个处理者
public void setNextHandler(AbstractHandler nextHandler) {
this.nextHandler = nextHandler;
}
public abstract void processRequest(Request request);
}
class HandlerLevel1 extends AbstractHandler {//具体处理者:等级1
@Override
public void processRequest(Request request) {
if (request.getLevel() <= 1) {
System.out.println("等级 1 处理者,成功处理请求");
} else {
System.out.println("处理请求失败,当前 level 自动提升 1 ");
nextHandler.processRequest(request);
}
}
}
class HandlerLevel2 extends AbstractHandler {//具体处理者:等级2
@Override
public void processRequest(Request request) {
if (request.getLevel() <= 2) {
System.out.println("等级 2 处理者,成功处理请求");
} else {
System.out.println("处理请求失败,当前 level 自动提升 1 ");
nextHandler.processRequest(request);
}
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战