职责链模式,属于行为型模式。
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。(字面意思可能有点难理解,可以比如为一个团队,每个人怎么配合,怎么分工才能完成一件事情)
责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。
这里需要注意几个名词:”接受者对象的链“,”发送者和接收者解耦“。
UML图:
下面以公司员工请假作为说明。见下图:
图中,描述的很直观,员工请假,每个领导的权限不一样,比如小组长只能批1天假,经历能批3天的假,董事长能批15天的假等等。图中说明:
1:”请假人“ 为发送者,发送请假申请。
2:”虚线里面的各个领导“ 是接收者。
3:而”虚线里面的各个领导“ 又组成了一个“领导链“(因为请假需要各级领导签字审批)
4:而 ”请假人“ 和 ”领导链“ 之间是又是解耦的,因为“请假人”并不知道“领导链”中的具体结构,请假审批到哪一步等等,”请假人“也并不需要关心。
下面以上面的例子做今天的代言演示,这里肯定需要有一个请假人,领导链(重点):
发起者(请假人):
接收者(领导链):
(这里的链通过类中有其自身来完成。比如组长的上级领导是经理,经理的上级领导是董事长等)
测试类:
测试类中,请假人都调用了boss对象(teamleader)的handler方法就行,而每个领导的职能又不一样,所以批准的领导也不一样。
以上例子
对于客户端来说,得到的只是Boss对象, 而这个boss对象是teamleader向上转型得到,还是ManagerLeader向上转型得到,客户端是不关心的,只需要Boss对象就能做请假(handler())就行。
对于服务端来说,组装好自己的“领导链”,各个层级有不同的职责,非常符合单一职责原则;对客户端来说这些内部结构是不透明的;
这样客户端和服务端得到了真正的解耦。
在java中用到职责模式也有很多:
1:structs中的action。
2:spring中配置interceptor拦截路劲。
3:javaweb 里面的filter