美文网首页
设计模式学习-责任链模式

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

作者: m1Ku | 来源:发表于2019-04-11 11:12 被阅读0次

定义

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

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源码浅析

相关文章

网友评论

      本文标题:设计模式学习-责任链模式

      本文链接:https://www.haomeiwen.com/subject/uaaziqtx.html