每个IT小白都有一颗技术大老的心,然而想学会十八般武艺却如蜀道之路步步艰难!想要迈出搬砖的生活,需要去学习技术的深度,宽展思想的广度,加强技术的历炼,从今天开始接触不一样的代码,不一样的武器,设计模式!
1:什么是责任链模式
定义:将接收者对象连成一条链,并在这条链上传递请求者的请求,直到有一个接收者处理该请求。通过让更多的接受者对象处理请求而避免了接受者和请求者的高耦合!
通过一个击鼓传花游戏来阐述这个定义:数人围成圆圈坐下,其中一人拿花,另有一人背着大家或蒙眼击鼓,鼓响时众人开始依次传花,至鼓停止为止。此时花在谁手中,谁就上台表演节目。
击鼓传花游戏分析:
敲鼓的人就代表着请求者,
传花的人就代表着接受者,
花就代表着请求,
敲鼓的人(请求者)只需要把花(请求)传给第一个人(发送给接受者),然后花(请求)在其他人(接受者链)上传递。而敲鼓的人并不知道谁拿着花(请求者不知道谁处理了请求)。停止敲鼓后花在谁手里谁就起来表演节目(任意一个接收者处理了该请求然后返回给请求者)
类图:
责任链类图
2:如何实现责任链模式
我们模拟一个请假的审批场景,假设公司规定组长可以审批半天以内的请假,项目经理可审批一天以内的请假,部门经理可以审批3天以内的请假,ceo可以审批超过三天的请假!
一:新建一个员工的类
Class of Employee二:新建一个审批人的抽象类
Class of Handler三:新建一个TeamLeader,ProjectLeader,Manager,CEO
Class of TeamLeader Class of ProjectLeader Class of Manger四:创建测试类,构建审批者链
Class of Main五:测试运行结果
Result of Test3:责任链模式的解耦
1):审批人之间的解耦:从上面的code 中我们就可以发现,每个审批人都是彼此独立的,没有任何的耦合关系,我们可以在构建责任链的那个函数中(ConstractChain)随意的添加或删除一个审批人,而不影响我们Employee的请求,完成了审批人之间的解耦。
2):员工和审批人之间的解耦:我们的Employee也只是依赖了一个抽象类,与真正的审批人也相互独立,也又一步的完成了员工类和审批人类的接耦。
(注:在真正的项目中,更多的是使用spring的IOC来完成类与类之间的关系构建,关于spring 的内容以后会在开一个栏目,慢慢更新)
4:责任链的应用实例
1):Javascript 中的事件冒泡
2):Struts2 中的拦截器
3):Jsp Servlet 中的Filter
4):使用的场景,当需要多个对象处理统一个请求时,比如Java Web 中的Filter; 在不明确接收者对象时,只需要向责任链的链头发一个Request,就可以得到处理,不许要关注哪个对象在处理。
5:责任链的优缺点
优点:
1):让每个接收者的责任和分担很明确,
2):处理流程的流程可以随意配置,处理方式更加灵活
3):各个接收者互不干涉,发送者也不用关心是哪个处理者在处理,只需要结果,更好的解决了类于类之间的耦合度
缺点:
在构建链时,需要创建很多类,而且有些类也不一定用的到,比较浪费内存。
网友评论