简单一招解决首页弹窗逻辑复杂问题--责任链模式

4,411 阅读4分钟

开头,上 Demo-ActionChain by gitee

我想讲一个19年重构首页弹窗逻辑的故事,不过故事冗长,放最后了。

直接上干货

责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。From baike.baidu.com

如果看百度百科上对于责任链模式的描述有点迷茫,其实简单的一句话就能理解责任链模式:

责任链就是一种链表

设计模式中,责任链模式和数据结构中的链表属于同一种思想

链表

deliverability.png

责任链 deliverability.png

链表会以 Node 为节点,记录下一个节点的地址,还有当前节点的数据;责任链会以 Action 为节点,记录下一个节点的地址,还有当前节点要处理的行为。

为了更好理解,再上源码举例

// 代码节选自 LinkedList 
private static class Node<E> {
    E item;
    Node<E> next;
    Node<E> prev;

    Node(Node<E> prev, E element, Node<E> next) {
        this.item = element;
        this.next = next;
        this.prev = prev;
    }
}
    
// 代码节选自 呃 个人代码实现
public abstract class AbsAction implements Action {

    private Action next;

    @Override
    public Action setNext(Action action) {
        next = action;
        return this;
    }

    @Override
    public void doNext() {
        if (next != null) {
            next.start();
        }
    }

    @Override
    public abstract void handle();

    @Override
    public Action start() {
        handle();
        return this;
    }
}

LinkedList维护的是一个双向链表,所以每个节点中会有 next、 prev两个节点信息,如果是单向链表就只有一个 next节点,这和责任链的简单实现是一样的。如果说链表和责任链有什么区别,那么一个是通过 item存储数据,一个通过 handle()存储方法。

理解了责任链,接下来在项目中也就很好重构了,找到还在运营的业务弹窗,找产品经理确认优先级(同时满足条件优先弹出哪个弹窗),然后在弹窗中建造一个实现责任链接口的Builder(其实弹窗直接实现责任链接口也行),最后在项目里添加初始化链表方法,链表调用方法就够了。

最后,上故事

大约是19年春,公司项目主页是 viewpager+fragment实现的,第一个 fragment是项目的首页,里头会有许多业务弹窗会被触发,触发时机有切换页面、首次启动app、首页数据刷新等。除此之外,许多废弃业务的老代码如跗骨之疽一样牢牢地嵌套在首页逻辑中,贸然删除又会影响之后的逻辑。这些老代码不仅尾大不掉,还严重影响开发效率。

我那时来公司半年多点,和技术组长一起整理了一遍相关逻辑,A不展示看B,B完了看C,C之后根据状态判断D或F,D到F之间还有可能有E,F完了还会判断A,一般情况起点是A,部分情况D、E都有可能为起点,之后每每有添加首页弹窗逻辑,就先看这个8字型流程图,找弹窗如何添加。

整理流程图后,平静了两个月左右,再之后产品又要求加一个弹窗,优先级最低,其他弹窗都不弹才弹,8字形流程图又变成了已8字形逻辑图为核心、放射形子逻辑线为辅的无用参考了。

产品:我要在首页配置弹窗

开发:不,你不配

再然后,我接到了一个项目,要求首页再来一个弹窗 /dog

作者:自如大前端研发中心-超级ZO研发组-VodLee

招聘信息

自如大前端研发中心招募新同学!

FE/iOS/Android工程师

公司福利有:

  • 全额五险一金,并额外购买商业保险
  • 免费健身房+年度体检
  • 公司附近租房9折优惠
  • 每年2次晋升机会 办公地点:北京酒仙桥普天实业科技园 欢迎对技术有执着热爱的你加入我们!简历请投递 zhangxl122@ziroom.com, 或加微信 v-nice-v 详聊!