版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40646143/article/details/85256373
Java的23中设计模式分类三大类:
- 行为型模式 -- 关注系统中对象之间的相互交互 , 研究系统在运行时对象与对象之间的相互通信和协作,进一步明确对象的职责
- 创造型模式 -- 关注对象的创建过程
- 结构型模式 -- 关注对象和类的组织
责任链模式定义:
- 将能够处理同一类的对象连成一条链,所提交的请求沿着链传递 , 链上的对象逐个判断是否有能力处理该请求 , 如果能处理则处理 , 如果不能则传递给链上的下一个对象 。
场景如下:
公司里面 ,请假条的审批流程 :
- 如果请假天数小于3天,主任审批
- 如果请假天数大于3天,小于10天 ,经理审批
- 如果请假天数等于10天 ,小于30天,总经理审批
- 如果等于30天,提示拒绝
uml类图如下
接下来代码来进行实现
1),创建请假条的类 Leave
/**请假条类
* @author 晓电脑
*/
public class Leave {
private String name;
private int leaveDays;
private String describe;
public Leave(String name, int leaveDays, String describe) {
this.name = name;
this.leaveDays = leaveDays;
this.describe = describe;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLeaveDays() {
return leaveDays;
}
public void setLeaveDays(int leaveDays) {
this.leaveDays = leaveDays;
}
public String getDescribe() {
return describe;
}
public void setDescribe(String describe) {
this.describe = describe;
}
}
2),创建抽象处理者的类 Leader
/** 抽象类
* @author 晓电脑
*/
public abstract class Leader {
protected String name;
/**
* 责任链的后继对象
*/
protected Leader nextLeader;
public Leader(String name) {
this.name = name;
}
public void setNextLeader(Leader nextLeader) {
this.nextLeader = nextLeader;
}
public abstract void HandlerRequest(Leave leave);
}
3),创建经理类 Diector类 继承于抽象类
/**主任类
* @author 晓电脑
*/
public class Director extends Leader {
public Director(String name) {
super(name);
}
@Override
public void HandlerRequest(Leave leave) {
if (leave.getLeaveDays()<3){
System.out.println("员工:" + leave.getName() + "请假天数" + leave.getLeaveDays() + "请假理由" + leave.getDescribe());
System.out.println("主任" + this.name + "进行了批准");
}else{
if (this.nextLeader != null){
this.nextLeader.HandlerRequest(leave);
}
}
}
}
4),创建经理类 也同样继承与抽象类
/**经理类
* @author 晓电脑
*/
public class Manager extends Leader {
public Manager(String name) {
super(name);
}
@Override
public void HandlerRequest(Leave leave) {
if (leave.getLeaveDays()<10){
System.out.println("员工:" + leave.getName() + "请假天数" + leave.getLeaveDays() + "请假理由" + leave.getDescribe());
System.out.println("经理" + this.name + "进行了批准");
}else{
if (this.nextLeader != null){
this.nextLeader.HandlerRequest(leave);
}
}
}
}
5),创建总经理类 也继承与抽象类
/**总经理类
* @author 晓电脑
*/
public class GeneralManager extends Leader {
public GeneralManager(String name) {
super(name);
}
@Override
public void HandlerRequest(Leave leave) {
if (leave.getLeaveDays()<30){
System.out.println("员工:" + leave.getName() + "请假天数" + leave.getLeaveDays() + "请假理由" + leave.getDescribe());
System.out.println("总经理" + this.name + "进行了批准");
}else{
System.out.println("这位员工居然请假" + leave.getLeaveDays() + "莫非想辞职");
}
}
}
6),创建测试客户端
/**
* @author 晓电脑
*/
public class Client {
public static void main(String[] args) {
//初始化经理
Leader a = new Director("张三");
Leader b = new Manager("李四");
Leader c = new GeneralManager("王五");
//追加责任链
a.setNextLeader(b);
b.setNextLeader(c);
//请假流程
Leave leave = new Leave("赵六",8,"回老家探亲");
a.HandlerRequest(leave);
}
}
运行结果如下
开发中常见的场景:
- Java中 ,异常机制就是一种责任链模式。 一个try可以对应多个catch ,当第一个catch不匹配类型 ,则自动跳到第二个catch。
- Servlet 开发中.过滤器的链式处理
- Struts2 中 ,拦截器的调用也是典型的责任链模式
后期优化,通过数组,集合生成责任链更加实用