目录
1.责任链概念
允许请求沿着处理者链传递,直到链上的某个处理者决定处理此请求。通过这种方式,请求的发送者无须知道是哪一个接收者处理其请求,这使得系统可以动态地重新组织和分配责任。
2.责任链组成
抽象处理者(Handler): 定义一个处理请求的接口,并持有下一个处理者的引用。
具体处理者(Concrete Handlers): 实现抽象处理者的接口,在处理请求前判断自己是否能够处理该请求,如果可以则进行处理,否则将请求传递给下一个处理者。
客户端(Client): 创建处理者链并将请求发送到链的第一个节点。
3.举个栗子:
以学生请假为例
7天 正常流程:老师(小于2天)==>领导(7天以下)===>校长(所有都行) 结果==》导员批
7天 非正常流程(导员有事): 老师(小于2天)===>校长(所有都行) 结果==》校长批
15天 正常流程:老师(小于2天)==>领导(7天以下)===>校长(所有都行) 结果==》校长批
主要部分:
- 老师:这是第一个处理请求的对象,如果请求可以处理,则处理请求,否则将请求传递给下一个对象。
- 导员:这是第二个处理请求的对象,如果请求可以处理,则处理请求,否则将请求传递给下一个对象。
- 校长:这是最后一个处理请求的对象,如果请求可以处理,则处理请求,否则请求将被拒绝。
通过这种方式,责任链模式允许将请求沿着一个链传递,直到有对象处理该请求为止。
4.代码实现
1)抽象处理者
这段代码定义了一个责任链模式中的抽象处理者类 Handler。
类定义
Handler 是一个抽象类,用于定义责任链中的处理者。
成员变量
protected Handler nextHandler:表示下一个处理者。
设置下一个处理者
public Handler setNextHandler(Handler nextHandler):设置当前处理者的下一个处理者,并返回下一个处理者。
处理方法
public abstract void handle(int day):定义一个抽象方法 handle,用于处理请求。
package org.xiji.ChainOfResponsibility;
/**
* 抽象处理者
*/
public abstract class Handler {
/**
* 下一个处理者
*/
protected Handler nextHandler;
public Handler setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
return this.nextHandler;
}
/**
* 定义处理方法
*/
public abstract void handle(int day);
}
2)具体处理者
老师
这段代码定义了一个责任链模式中的具体处理者类 Teacher,继承自抽象处理者类 Handler。
类定义
Teacher 类继承自抽象处理者类 Handler。
处理方法
public void handle(int day):重写了从 Handler 抽象类继承来的 handle 方法。
如果请假天数 day 小于等于 2 天,则由老师批准。
否则,将请求传递给下一个处理者。
package org.xiji.ChainOfResponsibility;
/**
* 老师
*/
public class Teacher extends Handler{
@Override
public void handle(int day) {
if (day <= 2) {
System.out.println("老师批注请假"+day+"天");
}else {
nextHandler.handle(day);
}
}
}
导员
这段代码定义了一个责任链模式中的具体处理者类 Instructor,继承自抽象处理者类 Handler。
类定义
Instructor 类继承自抽象处理者类 Handler。
处理方法
public void handle(int day):重写了从 Handler 抽象类继承来的 handle 方法。
如果请假天数 day 小于等于 7 天,则由导员批准。
否则,将请求传递给下一个处理者。
package org.xiji.ChainOfResponsibility;
/**
* 导员
*/
public class Instructor extends Handler{
@Override
public void handle(int day) {
if (day <= 7) {
System.out.println("导员批注请假"+day+"天");
} else {
nextHandler.handle(day);
}
}
}
校长
这段代码定义了一个责任链模式中的具体处理者类 Principal,继承自抽象处理者类 Handler。
类定义
Principal 类继承自抽象处理者类 Handler。
处理方法
public void handle(int day):重写了从 Handler 抽象类继承来的 handle 方法。
不论请假天数是多少,均由校长批准
package org.xiji.ChainOfResponsibility;
/**
* 校长
*/
public class Principal extends Handler{
@Override
public void handle(int day) {
System.out.println("校长批注请假"+day+"天");
}
}
3)客户端类
这段代码定义了一个责任链模式的测试类 ChainOfResponsibilityMain,展示了如何使用责任链模式处理请假请求。
初始化对象
创建 Teacher、Instructor 和 Principal 对象。
设置责任链
设置责任链关系:
teacher.setNextHandler(instructor);:老师处理完后交给导员。
instructor.setNextHandler(principal);:导员处理完后交给校长。
处理请假请求
正常流程请7天假
请假关系:老师 → 导员 → 校长
输出结果:导员批准请假7天。
非正常流程请7天假
请假关系:老师 → 校长
输出结果:校长批准请假7天。
正常流程请15天假
请假关系:老师 → 导员 → 校长
输出结果:校长批准请假15天。
package org.xiji.ChainOfResponsibility;
/**
* 处理器测试类
*/
public class ChainOfResponsibilityMain {
public static void main(String[] args) {
//老师角色
Teacher teacher = new Teacher();
//导员角色
Instructor instructor = new Instructor();
//校长角色
Principal principal = new Principal();
System.out.println("===========================");
/**
* 请假关系 老师==>导员===>校长
*/
System.out.println("正常流程请7天假");
teacher.setNextHandler(instructor);
instructor.setNextHandler(principal);
//例如找老师请假七天
int day = 7;
teacher.handle(day);
System.out.println("===========================");
System.out.println("非正常流程请7天假");
//找老师请假七天,导员不在,老师让你找校长
/**
* 请假关系 老师===>校长
*/
teacher.setNextHandler(principal);
teacher.handle(day);
System.out.println("===========================");
System.out.println("正常流程请15天假");
//想请15天假
int day2 = 15;
//正常流程 找老师请假===>导员===>校长
teacher.setNextHandler(instructor);
instructor.setNextHandler(principal);
teacher.handle(day2);
}
}
5.运行结果
附录:
1)23种设计模式讲解地址
23种设计模式讲解地址
专题地址:https://blog.csdn.net/2301_76862031/category_12779841.html
设计模式之访问者模式地址: https://blog.csdn.net/2301_76862031/article/details/141716629
设计模式之简单工厂模式地址: https://blog.csdn.net/2301_76862031/article/details/141641161
设计模式之策略模式工厂地址:https://blog.csdn.net/2301_76862031/article/details/141647304
设计模式之备忘录模式地址: https://blog.csdn.net/2301_76862031/article/details/141678153
设计模式之代理模式: https://blog.csdn.net/2301_76862031/article/details/141681834
设计模式之单例模式: https://blog.csdn.net/2301_76862031/article/details/141684340
设计模式之迭代器模式: https://blog.csdn.net/2301_76862031/article/details/141690379
设计模式之观察者模式:https://blog.csdn.net/2301_76862031/article/details/141723684
设计模式之命令模式: https://blog.csdn.net/2301_76862031/article/details/141728371
设计模式之模板方法模式: https://blog.csdn.net/2301_76862031/article/details/141729898
设计模式之桥接模式: https://blog.csdn.net/2301_76862031/article/details/141748997
设计模式之适配器模式: https://blog.csdn.net/2301_76862031/article/details/141752130
设计模式之外观模式: https://blog.csdn.net/2301_76862031/article/details/141753019
设计模式之享元模式: https://blog.csdn.net/2301_76862031/article/details/141755905
设计模式之原型模式: https://blog.csdn.net/2301_76862031/article/details/141759296
设计模式之责任链模式: https://blog.csdn.net/2301_76862031/article/details/141760704
设计模式之中介模式: https://blog.csdn.net/2301_76862031/article/details/141777728
设计模式之装饰者模式: https://blog.csdn.net/2301_76862031/article/details/141784167
设计模式之状态模式: https://blog.csdn.net/2301_76862031/article/details/141786766
设计模式之组合模式: https://blog.csdn.net/2301_76862031/article/details/141787708
设计模式之工厂方法模式: https://blog.csdn.net/2301_76862031/article/details/141826862
设计模式之解释器模式: https://blog.csdn.net/2301_76862031/article/details/141859953