- 什么是责任链模式
- 责任链模式例子
- 责任链模式的优缺点
- 责任链模式的使用场景
- 闲言碎语
什么是责任链模式
i借用《大话设计模式》的一个场景.当你在公司感觉工资太低的时候去找你你们项目经理去涨工资的时候.一般而言有部分项目经理会给你来上一大碗心灵毒鸡汤.而有一部分经理则会笑嘻嘻的告诉你这个事情他做不了主.需要找部门经理.当然,直接告诉你可以涨工资的概率可以忽略不计.这下我们来分析第二种情况.往往这时项目经理会把你的信息反馈给你的部门经理,部门经理有反馈给总经理.然后就要看你的运气了!!!这只是在现实中.而在程序中我们往往也会遇到这种情况.这时我们就要用到责任链模式了,责任链模式分为以下三个部分:
抽象处理者角色(Handler:Approver):定义一个处理请求的接口,和一个后继连接(可选)
具体处理者角色(ConcreteHandler:President):处理它所负责的请求,可以访问后继者,如果可以处理请求则处理,否则将该请求转给他的后继者。
客户类(Client):向一个链上的具体处理者ConcreteHandler对象提交请求。
UML
责任链模式例子
责任链的接口
package com.designPattern.handler;
/**
* 责任链链模式的接口
*
* @author jason
*
*/
public interface Handler {
/**
* 获得下一个请求者
*
* @return
*/
public Handler getNext();
/**
* 处理任务
*/
public void doTask(String task);
/**
* 设置下一个请求者
*/
public void setNext(Handler handler);
}
抽象的责任链类
package com.designPattern.handler;
public abstract class AbstractHandler implements Handler {
protected Handler handler;
/**
* 获得下一个请求者
*
* @return
*/
@Override
public Handler getNext() {
return handler;
}
/**
* 设置下一个请求者
*/
@Override
public void setNext(Handler handler) {
this.handler = handler;
}
}
具体的节点(项目经理)
package com.designPattern.handler;
/**
* 项目经理
*
* @author jason
*
*/
public class ProjectManager extends AbstractHandler {
@Override
public void doTask(String task) {
switch (task) {
case "请假":
System.out.println("同意请假!");
break;
case "调休":
System.out.println("同意调休!");
break;
default:
System.out.println(task + "已经上交给部门经理");
handler.doTask(task);// 其他事情超出权限的事情交给上级
}
}
}
具体的节点(部门经理)
package com.designPattern.handler;
/**
* 总经理
*
* @author jason
*
*/
public class DepartmentManager extends AbstractHandler {
@Override
public void doTask(String task) {
switch (task) {
case "申请材料":
System.out.println("加薪没门!");
break;
default:
System.out.println(task + "已经上交给总经理");
handler.doTask(task);
}
}
}
具体的节点(总经理)
package com.designPattern.handler;
/**
* 部门经理
*
* @author jason
*
*/
public class GeneralManager extends AbstractHandler {
@Override
public void doTask(String task) {
switch (task) {
case "加薪":
System.out.println("加薪没门!");
break;
default:
System.out.println(task + "是什么意思?");
}
}
}
测试用例
package com.designPattern.handler;
import org.junit.Test;
/**
* 测试用例
*
* @author jason
*
*/
public class TestCase {
@Test
public void Test() {
Handler projectManager = new ProjectManager();
Handler departmentManager = new DepartmentManager();
Handler generalManager = new GeneralManager();
projectManager.setNext(departmentManager);
departmentManager.setNext(generalManager);
projectManager.doTask("加薪");
}
}
责任链模式的优缺点
优点:
1、降低耦合度。它将请求的发送者和接收者解耦。
2、简化了对象。使得对象不需要知道链的结构。
3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
4、增加新的请求处理类很方便。
缺点:
1、不能保证请求一定被接收。
2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
3、可能不容易观察运行时的特征,有碍于除错。
责任链模式的使用场景
1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3、可动态指定一组对象处理请求。
闲言碎语
众所周知,tomcat的拦截器就是依靠责任链模式实现的.等日后看完tomcat的源码后再对这个博客进行补充!