设计模式 - chain of Responsibility
Chain of Responsibility也就是职责链模式,通过使用链式结构,使对象都有机会处理请求,从而避免请求的发送者与接受者间的耦合关系。将这些对象连成链,并沿着该链传递请求,直到有对象处理为止。
实现的关键在于处理对象的转发机制,也就是如果我能处理,那么我处理,如果不能处理,就转发给后面的对象处理。但普通的实现方法中,该处理对象必须保有后面对象的引用,也就是仍存在一定程度的耦合。理想的情况是处理对象(handler)之间彼此不知对方,通过另外的机制完成对象传递。
Apache有开源框架实现职责链模式,用户可以通过配置xml来决定请求的处理顺序,而handler只需实现固定接口即可。
举个例子:
某皮包公司有各种总,但这些总共享三个秘书(不要理解错了),分为为lilyzhou, LucyWang和RuHua。总们签署的文件会交给秘书们处理,lilyzhou是大秘,LucyWang是二秘,RuHua是三秘。liliy不愿意处理的文件交给LucyWang,LucyWang不愿意处理的交给Ruhua。ruhua没有不愿意的权利,只能自己处理。
秘书们的特殊爱好如下:lilyzhou只处理boss.zhang签署的文件(她认为自己是秘书中的老大),LucyWang只处理boss.li签署的文件,Ruahua处理她们不愿意的处理的文件(有人的地方就有江湖啊)
下面贴出代码:
1 2 3 4 5 6 7 8 | package com.inspur.jiyq.designpattern.responsibilitychain; public interface Secretary { public void handover(ImporantFile file); public void dealWithIt(ImporantFile file); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | package com.inspur.jiyq.designpattern.responsibilitychain; public class ImporantFile { /** * 文件签名 boss.zhang, boss.li, bossWang */ private String signature; public String getSignature() { return signature; } public void setSignature(String signature) { this .signature = signature; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package com.inspur.jiyq.designpattern.responsibilitychain; import com.inspur.jiyq.designpattern.responsibilitychain.impl.LilyZhou; public class BossOnDuty { public static void main(String[] args) { ImporantFile file = new ImporantFile(); file.setSignature( "boss.sun" ); Secretary secretary = new LilyZhou(); secretary.handover(file); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | package com.inspur.jiyq.designpattern.responsibilitychain.impl; import com.inspur.jiyq.designpattern.responsibilitychain.ImporantFile; import com.inspur.jiyq.designpattern.responsibilitychain.Secretary; public class LilyZhou implements Secretary { private Secretary lucyWang = new LucyWang(); @Override public void handover(ImporantFile file) { if (file.getSignature().equals( "boss.zhang" )) { dealWithIt(file); } else { lucyWang.handover(file); } } @Override public void dealWithIt(ImporantFile file) { // TODO Auto-generated method stub System.out.println( "lilyzhou deal with it." ); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | package com.inspur.jiyq.designpattern.responsibilitychain.impl; import com.inspur.jiyq.designpattern.responsibilitychain.ImporantFile; import com.inspur.jiyq.designpattern.responsibilitychain.Secretary; public class LucyWang implements Secretary{ private Secretary ruhua = new RuHua(); @Override public void handover(ImporantFile file) { if (file.getSignature().equals( "boss.li" )) { dealWithIt(file); } else { ruhua.handover(file); } } @Override public void dealWithIt(ImporantFile file) { System.out.println( "lucyWang deal with it." ); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | package com.inspur.jiyq.designpattern.responsibilitychain.impl; import com.inspur.jiyq.designpattern.responsibilitychain.ImporantFile; import com.inspur.jiyq.designpattern.responsibilitychain.Secretary; public class RuHua implements Secretary { @Override public void handover(ImporantFile file) { // RuHua can not deliever it to anybody else dealWithIt(file); } @Override public void dealWithIt(ImporantFile file) { System.out.println( "RuHua deal with it." ); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述