责任链模式简介
责任链(Chain of Responsibility)设计模式 :
责任链模式是对象的行为模式。使多个对象都有机会处理请求,从而避免请求的发送者和接受者直接的耦合关系。
一个简单的案例
蜀汉公司的请假审批过程
如果请假小于2天,由主任 张飞 审批如果请假天数大于2天 小于 7 天,则由经理 关二哥 审批如果请假天数大于等于7天小于20天 ,则由董事长 刘老大审批如果大于等于20天 坚决拒绝
诚然,我们第一反应,这可以使用 if else 语句完美解决但是一旦业务复杂起来,那么使用 if else 难免造成程序的混乱。而且,一旦需求有变,那么就必须将源代码进行大量修改。使用 责任链设计模式 则可以较好的解决这一问题,即使是需求有变,我们也可以通过反射机制,通过读取配置文件的方式,进行修改。而不需要修改源代码。
它使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
下面开始quickstart
1.首先定义一个request请求
request请求模型是一个javabean 有员工姓名请假天数和请假原因
public class Request {
/**
* 员工姓名
*/
private String empName;
/**
* 请假天数
*/
private int dayNum;
/**
* 请假原因
*/
private String reason;
public Request(String empName,
int dayNum, String reason) {
super();
this.empName = empName;
this.dayNum = dayNum;
this.reason = reason;
}
public String
getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public int getDayNum() {
return dayNum;
}
public void setDayNum(
int dayNum) {
this.dayNum = dayNum;
}
public String
getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
}
2.定义一个Handler 抽象类
public abstract class Handler {
protected String name;
protected Handler nextHandler;
/**
* 设置领导的姓名
* @param name
*/
public Handler(String name) {
super();
this.name = name;
}
/**
* 设置责任链表的后继
* @param nextHandler
*/
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
/**
* 处理业务的方法
* @param request
*/
public abstract void handleRequest(Request request);
}
3.根据handler 创建 处理 的领导人
/**
* 主任
* @author guxiang
* @date 创建时间:2017年2月6日 上午12:27:30
* @version 1.0
*/
public class Director extends Handler {
public Director(String name) {
super(name);
}
@Override
public void handleRequest(Request request) {
if (request.getDayNum()<
2) {
System.out.println(
"员工"+request.getEmpName()+
"由于"+request.getReason()+
"请假"+request.getDayNum()+
"天");
System.out.println(
"主任:"+
this.name+
"同意!");
}
else {
if (
this.nextHandler!=
null) {
this.nextHandler.handleRequest(request);
}
}
}
}
/**
* 经理
* @author guxiang
* @date 创建时间:2017年2月6日 上午12:26:08
* @version 1.0
*/
public class Manger extends Handler {
public Manger(String name) {
super(name);
}
@Override
public void handleRequest(Request request) {
if (request.getDayNum()<
7) {
System.out.println(
"员工"+request.getEmpName()+
"由于"+request.getReason()+
"请假"+request.getDayNum()+
"天");
System.out.println(
"经理:"+
this.name+
"同意!");
}
else {
if (
this.nextHandler!=
null) {
this.nextHandler.handleRequest(request);
}
}
}
}
package chainOfResp;
/**
* 董事长
* @author guxiang
* @date 创建时间:2017年2月6日 上午12:29:34
* @version 1.0
*/
public class Chairman extends Handler {
public Chairman(String name) {
super(name);
}
@Override
public void handleRequest(Request request) {
if (request.getDayNum()<
20) {
System.out.println(
"员工"+request.getEmpName()+
"由于"+request.getReason()+
"请假"+request.getDayNum()+
"天");
System.out.println(
"董事长:"+
this.name+
"同意!");
}
else {
System.out.println(
"坚决不同意!");
}
}
}
3.我们定义一个client 来测试
public class Client {
public static void main(String[] args) {
Handler director =
new Director(
"张三");
Handler manger =
new Manger(
"关二哥");
Handler chairman =
new Chairman(
"刘老大");
director.setNextHandler(manger);
manger.setNextHandler(chairman);
Request request1 =
new Request(
"甲",
1,
"回家陪老婆");
director.handleRequest(request1);
Request request2 =
new Request(
"乙",
12,
"回家老家看亲戚");
director.handleRequest(request2);
Request request3 =
new Request(
"乙",
21,
"母亲生病了");
director.handleRequest(request3);
}
}
责任链设计模式的应用场景
1. java中 我们常用的 try catch catch catch 就是一种责任链 一个try可以对应多个catch 2. 在javaweb中 filter 就是非常典型的责任链设计模式 3. 在struts2中 拦截器也是非常经典的责任链设计模式 等等。。。 2,3两种 就是不修改源代码的责任链设计模式
转载请注明原文地址: https://ju.6miu.com/read-663180.html