1.定义
职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。由于英文翻译的不同,职责链模式又称为责任链模式,它是一种对象行为型模式。
2.uml图
3.示例代码:
示例:
审批假条 某OA系统需要提供一个假条审批的模块,如果员工请假天数小于3天,主任可以审批该假条;如果员工请假天数大于等于3天,小于10天,经理可以审批;如果员工请假天数大于等于10天,小于30天,总经理可以审批;如果超过30天,总经理也不能审批,提示相应的拒绝信息。
package com.wuhuiskiff.www.cor.code.request;
/**
* @Auther: 一叶扁舟
* @Date: 2019/3/7 15:05
* @Description:
*/
public abstract class Leader {
protected String name;
protected Leader leader;
public Leader(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public void setLeader(Leader leader) {
this.leader = leader;
}
// 请假
public abstract void handleRequest(LeaveRequest request);
}
package com.wuhuiskiff.www.cor.code.request;
/**
* @Auther: 一叶扁舟
* @Date: 2019/3/7 15:12
* @Description:主任
*/
public class Director extends Leader {
public Director(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest request) {
// 小于3天的请假
if(request.getLeaveDays() < 3){
System.out.println("主任批准"+ request.getLeaveName() +"的" + request.getLeaveDays() +"假");
}else{
if(this.leader != null){
this.leader.handleRequest(request);
}
}
}
}
package com.wuhuiskiff.www.cor.code.request;
/**
* @Auther: 一叶扁舟
* @Date: 2019/3/7 15:17
* @Description:经理批假:大于等于3天,小于10天
*/
public class Manager extends Leader {
public Manager(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest request) {
// 经理:大于3天的小于10的请假
if(request.getLeaveDays() >= 3 && request.getLeaveDays() < 10){
System.out.println("经理批准"+ request.getLeaveName() +"的" + request.getLeaveDays() +"假");
}else{
if(this.leader != null){
this.leader.handleRequest(request);
}
}
}
}
package com.wuhuiskiff.www.cor.code.request;
/**
* @Auther: 一叶扁舟
* @Date: 2019/3/7 15:17
* @Description:总经理批假:大于10天,小于30天的假
*/
public class GeneralManager extends Leader {
public GeneralManager(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest request) {
// 经理:大于10天的小于30的请假
if(request.getLeaveDays() >= 10 && request.getLeaveDays() < 30){
System.out.println("总经理批准"+ request.getLeaveName() +"的" + request.getLeaveDays() +"假");
}else{
System.out.println("总经理驳回"+ request.getLeaveName() +"的" + request.getLeaveDays() +"假");
}
}
}
package com.wuhuiskiff.www.cor.code.request;
/**
* @Auther: 一叶扁舟
* @Date: 2019/3/7 15:07
* @Description:
*/
public class LeaveRequest {
// 请假人
private String leaveName;
// 请假的天数
private int leaveDays;
public LeaveRequest(String leaveName, int leaveDays) {
this.leaveName = leaveName;
this.leaveDays = leaveDays;
}
public String getLeaveName() {
return leaveName;
}
public void setLeaveName(String leaveName) {
this.leaveName = leaveName;
}
public int getLeaveDays() {
return leaveDays;
}
public void setLeaveDays(int leaveDays) {
this.leaveDays = leaveDays;
}
}
package com.wuhuiskiff.www.cor.code.request;
/**
* @Auther: 一叶扁舟
* @Date: 2019/3/7 15:26
* @Description:
*/
public class Client {
public static void main(String[] args) {
Director director = new Director("张主任");
Manager manager = new Manager("李经理");
GeneralManager generalManager = new GeneralManager("总经理");
director.setLeader(manager);
manager.setLeader(generalManager);
LeaveRequest skiff = new LeaveRequest("skiff", 2);
LeaveRequest lisi = new LeaveRequest("lisi", 9);
LeaveRequest zhangsan = new LeaveRequest("zhangsan", 25);
LeaveRequest wangwu = new LeaveRequest("wangwu", 31);
director.handleRequest(skiff);
director.handleRequest(lisi);
director.handleRequest(zhangsan);
director.handleRequest(wangwu);
}
}
4.优缺点
职责链模式的优点
- 降低耦合度
- 可简化对象的相互连接
- 增强给对象指派职责的灵活性
- 增加新的请求处理类很方便
职责链模式的缺点
- 不能保证请求一定被接收。
- 系统性能将受到一定影响,而且在进行代码调试时不太方便;
- 可能会造成循环调用。
5.运用
(1). Java中的异常处理机制
try
{
……
}
catch(ArrayIndexOutOfBoundsException e1)
{
……
}
catch(ArithmeticException e2)
{
……
}
catch(IOException e3)
{
……
}
finally
{
……
}
(2) 早期的Java AWT事件模型(JDK 1.0及更早) :事件浮升(Event Bubbling)机制。
6.总结
- 在以下情况下可以使用职责链模式: 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。 可动态指定一组对象处理请求。
- 职责链模式可以避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。它是一种对象行为型模式。 职责链模式包含两个角色:抽象处理者定义了一个处理请求的接口;具体处理者是抽象处理者的子类,它可以处理用户请求。
- 在职责链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。