1.职责链模式(Chain of Responsibility Pattern):使多个对象都有机会处理请求,从而避免请求发送者与接收者耦合在一起。将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
2.类型:对象行为型模式
3.纯职责链
每个处理者接收到请求后,要么单纯转发请求,要么单纯处理请求。不允许既处理请求,又转发请求的情况。
请求必须被责任链上的某个处理者处理。不允许出现请求未被处理的情况
4…不纯职责链
每个处理者接收到请求后,除了单纯转发请求,或者单纯处理请求,还可以
部分处理请求后,转发完全处理请求后,转发给下个处理者
请求可以不被责任链上的任何处理者处理。
5.优点
遵守“迪米特法则”。请求发送者只负责创建链,不需要知道请求被哪个处理者处理,怎样处理。
遵守“开闭原则”,新增了一个处理者,只需要在客户端中重新建立链即可,原有系统不需要修改。
增强了灵活性。可以在运行时刻对职责链进行动态的增加或者修改。
6.缺点
请求不一定会被处理。无论是没有可以处理请求的接受者,还是责任链创建错误,都有可能导致请求不被处理。
可能造成死循环。责任链如果是环状的,可能会导致循环调用,造成死循环。
package 职责链模式;
import jdk.internal.org.objectweb.asm.Handle;
/*
Handler:抽象处理者
一般是抽象类。定义了处理请求的接口。
定义了请求处理抽象方法handleRequest(),规范了子类处理请求的操作。
为了将处理者组成一条链,抽象处理者需要返回一个本处理者的下个处理者的引用。
由于处理者的下方还是处理者,因此在抽象处理者中定义了一个抽象处理者类型的对象
(如结构图中的successor),作为下个处理者的引用(可选)。
ConcreteHandler:具体处理者
继承Handler的具体处理者角色。
实现了handleRequest()抽象方法来处理请求。
具体处理者接到请求后,如果可以处理就将请求处理掉;
否则通过对下个处理者的引用将请求转发给下个处理者。
*/
public class ChainOfResponsibilityPattern {
public static void main(String[] args) {
//组装职责链
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
// handler2.setSuccessor(null);//最后一个节点successor域赋空或者给父节点直接赋
handler1.setSuccessor(handler2);
//提交请求
handler1.handleRequest("adasdas");
System.out.println("------------------");
handler1.handleRequest("ac");
}
}
abstract class Handler{
protected Handler successor = null;
public void setSuccessor(Handler successor){
this.successor = successor;
}
public Handler getSuccessor(){
return successor;
}
//传入请求
public abstract void handleRequest(String judging);
}
class ConcreteHandler1 extends Handler{
@Override
public void handleRequest(String judging) {
if (judging.length()<3){//长度小于3
System.out.println(this.getClass().getSimpleName()+"处理请求");
}else{
System.out.println(this.getClass().getSimpleName()+"转发请求");
if (this.successor!=null) {
this.successor.handleRequest(judging);//转发请求
}
}
}
}
class ConcreteHandler2 extends Handler{
@Override
public void handleRequest(String judging) {
if (judging.length()>=3){//不是空
System.out.println(this.getClass().getSimpleName()+"处理请求");
}else{
System.out.println(this.getClass().getSimpleName()+"转发请求");
if (this.successor!=null) {
this.successor.handleRequest(judging);//转发请求
}
}
}
}