职责链模式详解(定义实现及应用场景)

职责链模式详解(定义实现及应用场景)-mikechen

职责链模式是常用的Java设计模式,下面我重点详解职责链模式的角色实现与应用场景@mikechen

职责链模式定义

职责链模式是一种对象行为型模式,该模式的主要思想是解耦请求发送者和请求处理者,将它们之间的关系由静态编码转化为动态运行时关系。

 

职责链模式应用场景

职责链模式的主要应用场景是处理复杂的请求或任务,并且这些请求或任务可以被分解成多个小的处理单元进行处理的情况。

通过将这些小的处理单元连接成一条处理链,可以实现高效的请求或任务处理。

以下是常见的职责链模式应用场景:

1.处理日志请求

当应用程序需要记录大量的日志时,可以使用职责链模式将日志请求发送到一个或多个处理器中进行处理,以避免单个处理器的负担过重。

2.处理异常情况

当一个应用程序需要处理多种类型的异常情况时,可以使用职责链模式将异常分发到不同的处理器中进行处理,每个处理器只处理它能够处理的异常类型。

4.处理数据校验

当一个应用程序需要对输入数据进行复杂的校验时,可以使用职责链模式将校验请求分发到不同的处理器中进行处理,每个处理器只处理它能够处理的校验规则。

 

职责链模式角色

职责链模式实现,包含如下3大角色:

职责链模式详解(定义实现及应用场景)-mikechen

1.抽象处理者(Handler)

定义了处理请求的接口和抽象处理方法,通常包含一个指向下一个处理者的引用。

2.具体处理者(ConcreteHandler)

实现了抽象处理者接口,处理请求的具体实现。

3.客户端(Client)

创建请求对象,并将其发送到职责链上。

 

职责链模式实现例子

1.首先,我们定义一个抽象处理者 Handler

public abstract class Handler {
    protected Handler successor;
    
    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }
    
    public abstract void handleRequest(Request request);
}

2.然后,我们定义具体处理者 ConcreteHandler1 和 ConcreteHandler2

public class ConcreteHandler1 extends Handler {
    @Override
    public void handleRequest(Request request) {
        if (request.getType() == RequestType.TYPE1) {
            System.out.println("Handled by ConcreteHandler1");
        } else if (successor != null) {
            successor.handleRequest(request);
        }
    }
}

public class ConcreteHandler2 extends Handler {
    @Override
    public void handleRequest(Request request) {
        if (request.getType() == RequestType.TYPE2) {
            System.out.println("Handled by ConcreteHandler2");
        } else if (successor != null) {
            successor.handleRequest(request);
        }
    }
}

最后,我们定义一个请求类 Request,包含一个请求类型枚举和一个请求数据。

public class Request {
    private RequestType type;
    private String data;
    
    public Request(RequestType type, String data) {
        this.type = type;
        this.data = data;
    }
    
    public RequestType getType() {
        return type;
    }
    
    public String getData() {
        return data;
    }
}

在客户端代码中,我们创建具体处理者对象,并将它们连接成一条处理链,然后向该处理链发送请求。

public class Client {
    public static void main(String[] args) {
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        handler1.setSuccessor(handler2);
        
        Request request1 = new Request(RequestType.TYPE1, "Request 1");
        Request request2 = new Request(RequestType.TYPE2, "Request 2");
        
        handler1.handleRequest(request1);  // Output: Handled by ConcreteHandler1
        handler1.handleRequest(request2);  // Output: Handled by ConcreteHandler2
    }
}

以上就是职责链模式详解,更多设计模式请查看:Java设计模式:23种设计模式(万字图文全面总结)

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法