Android 架构师4 设计模式之责任链模式

前言

责任链模式使多个对象都有机会可以处理请求,从而避免了请求的发送者和接收者的耦合关系,将这些对象形成一条链,并沿着这条链传递该请求。

需求

某公司接收游戏产品反馈回来的邮件有四类:其一,粉丝寄来的邮件,他们喜欢这个游戏;其二,父母寄来的邮件,抱怨他们的孩子沉迷于这个游戏;其三,店家寄来的邮件,想要一起合作推广;其四,垃圾邮件。公司接收到某个邮件,需要分这四种情况去处理,处理顺序可以随意指定。

责任链模式

《Android 架构师4 设计模式之责任链模式》 责任链模式.png

请求抽象类AbstractRequest:

public abstract class AbstractRequest {
    public final String requestType;

    public AbstractRequest(String requestType) {
        this.requestType = requestType;
    }
    public abstract String getRequestType();
}

请求具体类Request:

public class Request extends AbstractRequest {
    public request(String requestType) {
        super(requestType);
    }

    @Override
    public String getRequestType() {
        return requestType;
    }
}

抽象处理类AbstractHandler:

abstract class AbstractHandler {
    public AbstractHandler nextHandler;

    void handleRequest(AbstractRequest request) {
        if (getHandlerType().equals(request.getRequestType())) {
            handle();
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        } else {
            System.out.println("没有可处理的对象");
        }
    }

    abstract void handle();

    abstract String getHandlerType();
}

粉丝类型邮件FansHandler:

public class FansHandler extends AbstractHandler {
    @Override
    void handle() {
        System.out.println("处理" + getHandlerType() + "邮件");
    }

    @Override
    String getHandlerType() {
        return "粉丝类型";
    }
}

抱怨类型邮件ComplaintHandler:

public class ComplaintHandler extends AbstractHandler {
    @Override
    void handle() {
        System.out.println("处理" + getHandlerType() + "邮件");
    }

    @Override
    String getHandlerType() {
        return "抱怨类型";
    }
}

店家类型邮件ShopHandler:

public class ShopHandler extends AbstractHandler {
    @Override
    void handle() {
        System.out.println("处理" + getHandlerType() + "邮件");
    }

    @Override
    String getHandlerType() {
        return "店家类型";
    }
}

垃圾类型邮件SpamHandler:

public class SpamHandler extends AbstractHandler {
    @Override
    void handle() {
        System.out.println("处理" + getHandlerType() + "邮件");
    }

    @Override
    String getHandlerType() {
        return "垃圾类型";
    }
}

《Android 架构师4 设计模式之责任链模式》 1.png

公司去处理这些邮件,按照某种顺序,这里的顺序为:粉丝类型 —> 抱怨类型 —> 店家类型 —> 垃圾类型,这里从左往右形成了一个链子,前一个持有后一个的引用。

public class Client {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("粉丝类型", "抱怨类型", "店家类型", "垃圾类型");
        Random random = new Random();
        FansHandler fansHandler = new FansHandler();
        ComplaintHandler complaintHandler = new ComplaintHandler();
        ShopHandler shopHandler = new ShopHandler();
        SpamHandler spamHandler = new SpamHandler();
        fansHandler.nextHandler = complaintHandler;
        complaintHandler.nextHandler = shopHandler;
        shopHandler.nextHandler = spamHandler;
        Request request = new Request(list.get(random.nextInt(4)));
        fansHandler.handleRequest(request);
    }
}

运行,打印输出:

处理垃圾类型邮件!

责任链模式在Android中的应用

事件分发机制、Broadcast广播机制

总结

责任链模式的优点是将请求的发送者和接收者解耦;可以简化你的对象,因为它不需要知道链的结构;通过改变链内的成员或调动它们的次序,允许你动态地新增或者删除责任。而缺点就是并不保证请求一定会被执行;可能不容易观察运行时的特征,有碍于除错。

喜欢本篇博客的简友们,就请来一波点赞,您的每一次关注,将成为我前进的动力,谢谢!

    原文作者:zhang_pan
    原文地址: https://www.jianshu.com/p/be4df000b561
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞