Tomcat保障灵活性和可拓展性的解决方案(Pipeline和Valve)_tomcat灵活性体现在-优快云博客
上文提到职责链模式,本文简单介绍一下职责链模式的实现和作用
目录
0、定义
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
1、职责链模式的两种角色
- 处理者(Handler):这是个接口,包含两个方法,分别负责规定具体处理者处理请求的方法和具体处理者的后继对象。
- 具体处理者(ConcreteHandler):实现处理者Handler接口,在实例化后进行后继对象的注入,在运行时执行具体方法处理用户请求,在方法中,判断是否能够处理,若能则处理,若不能,则交由自己的后继对象进行处理,以此类推,形成链式。
2、职责链模式UML类图:
3、示例代码
处理者:
package xyz.jangle.design.chain;
/**
* 处理者
* @author Administrator
*
*/
public interface Handler {
public void handleRequst();
public void setNextHandler(Handler handler);
}
具体处理者1
package xyz.jangle.design.chain;
/**
* 具体处理者1
* @author Administrator
*
*/
public class ConcreteHandler1 implements Handler {
private Handler handler;
@Override
public void handleRequst() {
if((Math.random()*10) > 5) { //模拟规则
System.out.println("Handler1 处理了消息");
}else {
if(handler != null)
handler.handleRequst(); //委托下一个节点处理
}
}
@Override
public void setNextHandler(Handler handler) {
this.handler = handler;
}
}
具体处理者2
package xyz.jangle.design.chain;
/**
* 具体处理者2
* @author Administrator
*
*/
public class ConcreteHandler2 implements Handler {
private Handler handler;
@Override
public void handleRequst() {
if((Math.random()*10) > 5) { //模拟规则
System.out.println("Handler2 处理了消息");
}else {
if(handler != null)
handler.handleRequst(); //委托下一个节点处理
}
}
@Override
public void setNextHandler(Handler handler) {
this.handler = handler;
}
}
客户端(使用)
package xyz.jangle.design.chain;
/**
* 将2个具体处理者编织成链式,然后请求第一个处理者
* @author Administrator
*
*/
public class AppMain9 {
public static void main(String[] args) {
ConcreteHandler1 handler1 = new ConcreteHandler1();
ConcreteHandler2 handler2 = new ConcreteHandler2();
handler1.setNextHandler(handler2);
handler1.handleRequst(); //请求职责链的第一个对象
}
}
输出结果
Handler2 处理了消息
4、职责链模式的优点
- 责任链中的对象只和自己后继对象进行低耦合,不与其他对象进行关联。这使得编写处理对象及创建责任链变得非常容易。
- 当在处理者中分配职责时,责任链给应用程序更多灵活性。
- 应用程序可以动态的增加、删除处理者或重新指派处理者的职责。
- 应用程序可以动态改变处理者之间的顺序。
- 使用职责链的用户不必知道处理者的信息,用户不会知道到底哪个对象处理了它的请求。
注:此处强调动态,是因为静态的if else if 判断也可以实现职责链的效果,但无法进行动态的调整。
5、适合的使用情景
- 有许多对象可以处理用户请求,希望程序在运行时自动确定处理用户请求的对象。
- 希望用户不必明确指定接收者的情况下,向多个接收者中的一个提交请求。
- 程序希望动态制定可处理用户请求的对象集合。