职责链模式

84 阅读2分钟

这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战

职责链模式

为请求创建了一个接收者对象的链。而客户端不需要知道谁是具体的处理对象,也无须关心请求的处理细节和请求的传递过程,这样就实现了对请求的发送者和接收者进行解耦

结构

抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。

具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。

客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

image.png

演示

1、抽象处理类

public abstract class Handler {
    private Handler next;
    public void setNext(Handler handler) {
        this.next = handler;
    }
    public Handler getNext() {
        return this.next;
    }
    public abstract void handleRequest(String name);
}

2、具体处理类

public class LiNing extends Handler {
    @Override
    public void handleRequest(String name) {
        if (name!=null&&name.equals("lining")) {
            System.out.println("李宁品牌!");
        } else {
            if (this.getNext()!=null) {
                this.getNext().handleRequest(name);
            } else {
                System.out.println("无法处理!");
            }
        }
    }
}

public class Erke extends Handler {
    @Override
    public void handleRequest(String name) {
        if (name!=null&&name.equals("erke")) {
            System.out.println("鸿星尔克品牌!");
        } else {
            if (this.getNext()!=null) {
                this.getNext().handleRequest(name);
            } else {
                System.out.println("无法处理!");
            }
        }
    }
}

3、客户端

public class Client {
    public static void main(String[] args) {
        Handler lining = new LiNing();
        Handler erke = new Erke();
        lining.setNext(erke);
        lining.handleRequest("erke");
        // 鸿星尔克品牌!
    }
}

总结

优点

1、降低对象之间的耦合度,各个具体处理类无须知道链的结构

2、简化对象之间的相互连接

3、新增、删除具体处理类方便

缺点

1、无法保证请求就一定能被处理

2、具体处理类太多,调试不方便,可能导致循环调用

扩展:纯与不纯的职责链模式

纯的职责链模式:一个具体处理类处理一种请求,不存在处理一部分请求情况 不纯的职责链模式:一个请求分多个具体处理类处理