【设计模式】责任链模式

该模式主要用于处理一系列在同类型事务上具有相关性的场景,典型的如OKHTTP中的拦截器,采用的就是该模式,每个拦截器决定是否拦截还是交给下一个拦截点,各点之间连接成链,之所以是链是因为有一个点断开(即被拦截)则整个事务结束。责任链模式主要解决了各拦截器之间不相互感知且能按顺序执行。

理论模型

interceptor 接口,传递拦截链,拦截点需实现的接口
chain 定义链条,责任链的核心实现,持有所有的拦截点,控制责任链在拦截点之间的传递

整个模型的传递驱动其实是在实现层上,拦截点决定是拦截还是传递给下一个拦截点,而chain只是提供传递的方式

实例实现

场景

假设有A、B、C三个Dialog需要依次弹出显示,常规写法需要在每个Dialog消失的回调中弹出下一个弹框,功能结构不明朗,且修改起来异常麻烦,我们可以将弹出逻辑交给责任链执行,每个Dialog都是一个拦截点,自己判断弹出条件还是交给下个拦截点,这样Dialog不需知道下一个要弹出的是谁,而是交由责任链处理

分解实现

定义拦截器接口

拦截点实现该接口,表明它是一个拦截点,接口中入参是责任链对象,方便调用传递方法

interface DialogInterceptor {
   fun intercept(chain:DialogChain)
}

实现链条,提供传递方法

class DialogChain private constructor(val interceptors:MutableList<DialogInterceptor>){
    //传递责任链到下一个拦截点,也可传入参数进行逻辑处理
    fun proess(){
        interceptors?.let {
            //执行当前拦截点并移除
            if(it.size>0) {
                //it.get(0).intercept(this);
                //it.removeAt(0);
                it.removerAt(0).intercept(this)
               
            }
        }
    }
    //Builder 模式创建DialogChain
    class Builder{
        var interceptors: MutableList<DialogInterceptor> =ArrayList();
        fun addInterceptor(interceptor: DialogInterceptor):Builder{
           interceptors.add(interceptor);
            return this;
        }
        fun builder():DialogChain{
            return DialogChain(interceptors);
        }
    }
}

构建实例调用

class ADialog(context: Context?) : BaseDialog(context) {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setOnDismissListener {
            chain()?.proess()
        }
    }
    override fun intercept(chain: DialogChain) {
        super.intercept(chain)
        val isShow=true;//自定义是否拦截
        if(isShow){
            this.show();
        }else{
            chain.proess()
        }
    }
}

调用时

 DialogChain.Builder()
            .addInterceptor(dialogA)
            .addInterceptor(dialogB)
            .addInterceptor(dialogC)
            .builder()//创建责任链
            .proess()//开始启动责任链

通过proess()方法调用拦截器过滤接口,并管理所有存储的拦截器,拦截器处理完又调用proess()方法实现链条的传递,周而复始直到责任链中的拦截器用完

实践

GitHub 设计模式

参考

弹窗优先级解决方案

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值