这一篇博文我们介绍第三种设计模式行为型的第二类两个类自检的第三种模式责任链(ChainOfResponsibility)模式。其实这个模式很简单的,我们来学习吧。
1、责任链模式
为请求创建了一个接收者对象的链,使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系, 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。
2、使用场景
1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3、可动态指定一组对象处理请求。
3、UML
4、代码如下
AbstractHandler
public abstract class AbstractHandler {
private AbstractHandler handler;
public AbstractHandler getHandler() {
return handler;
}
public void setHandler(AbstractHandler handler) {
this.handler = handler;
}
public abstract void operation(String name);
}
MyHandler1、MyHandler2和MyHandler3
public class MyHandler1 extends AbstractHandler{
@Override
public void operation(String name) {
System.out.println("我是处理器1,我处理:"+name);
if(getHandler()!=null) {
getHandler().operation(name);
}
}
}
public class MyHandler2 extends AbstractHandler{
@Override
public void operation(String name) {
System.out.println("我是处理器2,我处理:"+name);
if(getHandler()!=null) {
getHandler().operation(name);
}
}
}
public class MyHandler3 extends AbstractHandler{
@Override
public void operation(String name) {
System.out.println("我是处理器3,我处理:"+name);
if(getHandler()!=null) {
getHandler().operation(name);
}
}
}
Test
public class Test {
public static void main(String[] args) {
AbstractHandler myHandler1 = new MyHandler1();
AbstractHandler myHandler2 = new MyHandler2();
AbstractHandler myHandler3 = new MyHandler3();
myHandler1.setHandler(myHandler2);
myHandler2.setHandler(myHandler3);
myHandler1.operation("我是一个待处理的字符串");
}
}
运行Test输出如下结果
我是处理器1,我处理:我是一个待处理的字符串
我是处理器2,我处理:我是一个待处理的字符串
我是处理器3,我处理:我是一个待处理的字符串
5、优缺点
优点
1、降低耦合度。它将请求的发送者和接收者解耦。
2、简化了对象。使得对象不需要知道链的结构。
3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。 4、增加新的请求处理类很方便。
缺点
1、不能保证请求一定被接收。
2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
3、可能不容易观察运行时的特征,有碍于除错。
总结
在责任链模式中,如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。其实我们也遇到了很多这种模式的使用,最典型的就比如Servlet中的Filter。