欢迎光临散文网 会员登陆 & 注册

Java设计模式之-责任链模式

2023-09-14 22:36 作者:bili_52912388700  | 我要投稿

什么是责任链模式?

责任链模式是一种行为型设计模式,它将请求的发送者和接收者解耦,并将请求沿着一个链传递,直到有一个对象能够处理它。在责任链模式中,每个处理者都可以选择处理请求或将其传递给链中的下一个处理者。


主要解决什么问题?

责任链模式主要解决以下问题:


解耦请求发送者和接收者:责任链模式使得请求发送者不需要知道请求将由哪个接收者处理,从而降低了对象间的耦合度。

动态组合和调整处理流程:责任链模式允许在运行时动态添加、移除或重新排列处理者,以适应不同的处理需求。

在什么时候我们需要使用责任链模式?

可以考虑使用责任链模式的情况包括:


当有多个对象可以处理同一请求,并且我们希望避免显式指定处理者时,可以使用责任链模式。

当希望动态组合和调整处理流程时,可以使用责任链模式。

用一个生活中的应用实例来举例、类比

想象一下在一个团队中提交请假申请的场景。假设请假申请需要经过三个层级的审批:组长、经理和总经理。请假申请的责任链就可以看作是一个处理流程,每个层级都有机会处理该请求。如果组长无法处理,请求将传递给经理,如果经理还无法处理,请求最终会传递给总经理。这里请假申请就是请求,组长、经理和总经理就是责任链中的处理者。


优点

责任链模式的优点包括:


解耦发送者和接收者:请求发送者不需要知道请求由哪个接收者处理,降低了对象间的耦合度。

灵活性和可扩展性:可以动态添加、移除或重新排列处理者,灵活地调整处理流程。

缺点

责任链模式的缺点包括:


请求可能无法被处理:如果责任链没有被正确配置或处理者没有正确设置,请求可能会无法被处理。

对性能的影响:由于请求可能会在责任链上进行传递,因此可能会对性能产生一定的影响。

使用场景

责任链模式适用于以下情况:


当有多个对象可以处理同一请求,并且希望动态确定处理者时。

当希望动态组合和调整处理流程时。

下面是一个简单的Java代码示例:

// 请求类

class Request {

    private String content;

    

    public Request(String content) {

        this.content = content;

    }

    

    public String getContent() {

        return content;

    }

}


// 处理者抽象类

abstract class Handler {

    protected Handler nextHandler;

    

    public void setNextHandler(Handler handler) {

        nextHandler = handler;

    }

    

    public abstract void handleRequest(Request request);

}


// 具体处理者类

class ConcreteHandlerA extends Handler {

    @Override

    public void handleRequest(Request request) {

        if (request.getContent().equals("A")) {

            System.out.println("ConcreteHandlerA handles the request.");

        } else if (nextHandler != null) {

            nextHandler.handleRequest(request);

        }

    }

}


class ConcreteHandlerB extends Handler {

    @Override

    public void handleRequest(Request request) {

        if (request.getContent().equals("B")) {

            System.out.println("ConcreteHandlerB handles the request.");

        } else if (nextHandler != null) {

            nextHandler.handleRequest(request);

        }

    }

}


class ConcreteHandlerC extends Handler {

    @Override

    public void handleRequest(Request request) {

        if (request.getContent().equals("C")) {

            System.out.println("ConcreteHandlerC handles the request.");

        } else if (nextHandler != null) {

            nextHandler.handleRequest(request);

        }

    }

}


// 示例客户端代码

public class Client {

    public static void main(String[] args) {

        Handler handlerA = new ConcreteHandlerA();

        Handler handlerB = new ConcreteHandlerB();

        Handler handlerC = new ConcreteHandlerC();

        

        // 构建责任链

        handlerA.setNextHandler(handlerB);

        handlerB.setNextHandler(handlerC);

        

        // 创建请求

        Request request1 = new Request("A");

        Request request2 = new Request("B");

        Request request3 = new Request("C");

        

        // 处理请求

        handlerA.handleRequest(request1);  // Output: ConcreteHandlerA handles the request.

        handlerA.handleRequest(request2);  // Output: ConcreteHandlerB handles the request.

        handlerA.handleRequest(request3);  // Output: ConcreteHandlerC handles the request.

    }

}

在上述示例中,使用了责任链模式来处理请求。Request 类表示请求,Handler 是处理者的抽象类,ConcreteHandlerA、ConcreteHandlerB 和 ConcreteHandlerC 是具体的处理者类。通过设置处理者的下一个处理者,构建了一个责任链。在客户端代码中,创建了三个请求,然后调用处理者的 handleRequest() 方法来处理请求,请求会在责任链上进行传递直到被处理。


Java设计模式之-责任链模式的评论 (共 条)

分享到微博请遵守国家法律