java设计模式中责任链模式的示例分析
一、什么是责任链模式
责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
二、责任链模式的优点
1、责任链模式可以实现,在隐瞒客户端的情况下,对系统进行动态的调整。
2、责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象处理。
3、增强给对象指派职责的灵活性。通过增加新的具体处理者,可以提高系统的灵活性,以适应新的变化。
4、减少了相应类之间的耦合。
三、责任链模式的示例分析
下面我们以一个请假的例子来说明责任链模式的实现:
在一个公司,请假需要经过经理、总监、总经理的审批,每个审批者都有权限审批一定天数的假期,如果超过权限范围,则需要继续上报。
public abstract class Handler {
protected Handler successor;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract void handleRequest(int request);
}
public class ConcreteHandler1 extends Handler {
@Override
public void handleRequest(int request) {
if (request >= 0 && request < 10) {
System.out.println(this.getClass().getName() + "处理请求 " + request);
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
public class ConcreteHandler2 extends Handler {
@Override
public void handleRequest(int request) {
if (request >= 10 && request < 20) {
System.out.println(this.getClass().getName() + "处理请求 " + request);
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
public class ConcreteHandler3 extends Handler {
@Override
public void handleRequest(int request) {
if (request >= 20 && request < 30) {
System.out.println(this.getClass().getName() + "处理请求 " + request);
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
public class Client {
public static void main(String[] args) {
Handler h1 = new ConcreteHandler1();
Handler h2 = new ConcreteHandler2();
Handler h3 = new ConcreteHandler3();
h1.setSuccessor(h2);
h2.setSuccessor(h3);
int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };
for (int request : requests) {
h1.handleRequest(request);
}
}
}
运行结果:
ConcreteHandler1处理请求 2
ConcreteHandler1处理请求 5
ConcreteHandler2处理请求 14
ConcreteHandler3处理请求 22
ConcreteHandler2处理请求 18
ConcreteHandler1处理请求 3
ConcreteHandler3处理请求 27
ConcreteHandler3处理请求 20
从上面的例子中可以看出,责任链模式的优势:
1、客户端只需要将请求发送到链上,而无须关心请求的处理细节和请求的传递过程;
2、提高了系统的灵活性,它支持动态的增加或者删除责任;
3、增强了给对象指派职责的灵活性,当工作流程发生变化时,可以动态地改变链内的成员或者调动它们的次序;
4、责任链可以避免指派者和接受者之间的循环依赖。
猜您想看
-
宝塔面板中如何设置网站访问日志分析
宝塔面板简介宝...
2024年05月30日 -
Django中怎么请求HTML页面视图信息
一、什么是HT...
2023年05月25日 -
SpringFramework中ProxyFactory的用法
1、Proxy...
2023年05月22日 -
如何避免敌军的打击
1、分析敌军情...
2023年05月15日 -
JVM虚拟机中Class文件的常量池是什么
1. 什么是J...
2023年07月23日 -
如何解决linux 下modelsim字太小问题
一、Linux...
2023年05月26日