设计模式学习-责任链模式

定义

使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合。将这些对象连成一个链,并沿着这条链传递该请求,直到有对象处理它为止。

UML类图

责任链模式.png

责任链模式的角色

  • AbstractRequest

    抽象请求类,封装请求的公有方法。

  • ConcreteRequest

    具体请求类,实现抽象请求并实现自己的逻辑,如请求级别等。

  • AbstractHandler

    抽象处理类,持有下一个处理类的引用,判断是否可以处理当前请求或者继续分发请求。

  • ConcreteHandler

    具体处理类,实现处理请求的具体逻辑。

示例

责任链模式的示例代码,简单的判断当前处理类和请求类是否为同一级别,如果是则处理,否则继续分发到下一个处理类处理。

/**
 * 抽象请求类
 */
public abstract class AbstractRequest {

    private String content;

    public AbstractRequest(String content){
        this.content = content;
    }

    public String getContent() {
        return content;
    }

    abstract int requestLevel();
}

/**
 * 具体请求类
 */
public class ConcreteRequest1 extends AbstractRequest {

    public ConcreteRequest1(String content) {
        super(content);
    }

    @Override
    int requestLevel() {
        return 1;
    }
}

/**
 * 抽象处理类
 */
public abstract class AbstractHandler {

    public AbstractHandler nextHandler;
    private void handleRequest(AbstractRequest request){
        if (request.requestLevel()== handleLevel()){
            handle(request);
        }else {
            if (null!=nextHandler){
                nextHandler.handleRequest(request);
            }
        }
    }
    abstract int handleLevel();
    abstract void handle(AbstractRequest request);
}

/**
 * 具体处理类
 */
public class ConcreteHandler1 extends AbstractHandler {

    @Override
    int handleLevel() {
        return 1;
    }

    @Override
    void handle(AbstractRequest request) {
        System.out.println(this.getClass().getName() +"处理了"+request.getClass().getName()+"请求,"+"内容为"+request.getContent());
    }
}

public class ConcreteHandler2 extends AbstractHandler {

    @Override
    int handleLevel() {
        return 2;
    }

    @Override
    void handle(AbstractRequest request) {
        System.out.println(this.getClass().getName() +"处理了"+request.getClass().getName()+"请求,"+"内容为"+request.getContent());
    }
}

/**
 * 客户端类
 */
public class Client {
    public static void main(String[] args) {
        ConcreteRequest1 request1 = new ConcreteRequest1("request1 content");

        ConcreteHandler1 handler1 = new ConcreteHandler1();
        ConcreteHandler2 handler2 = new ConcreteHandler2();
        //构建责任链
        handler1.nextHandler = handler2;
        handler2.nextHandler = handler1;
        //从handler1开始处理request1请求
        handler1.handle(request1);
    }
}
>>
chain.ConcreteHandler1处理了chain.ConcreteRequest1请求,内容为request1 content

Android源码中的责任链模式

OkHttp中的核心请求逻辑就用到了责任链的设计模式,具体可以看Android源码学习-OkHttp源码浅析

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容