责任链模式 -- 让一个以上的对象有机会能够处理某个请求

责任链模式 – 让一个以上的对象有机会能够处理某个请求

责任链的优点

  1. 降低耦合度。它将请求的发送者和接收者解耦;
  2. 简化了对象。使得对象不需要知道链的结构;
  3. 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任;
  4. 增加新的请求处理类很方便。

责任链的缺点:

  1. 请求没有明确的接收者,不能保证它一定会被处理,该请求可能一直到链的末端都得不到处理;
  2. 对于比较长的职责链,请求的处理可能涉及到多个处理对象,系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用

责任链2种形式:
纯责任链模式和不纯的责任链模式。

如果一个类要么承担责任处理请求要么将请求踢给下一个皮球,则被称为纯责任链模式;如果一个类承担了一部分责任,还将请求踢给下一个皮球,则被称为不纯的责任链模式。纯的责任链模式的实际例子很难找到,一般看到的例子均是不纯的责任链模式的实现。

使用场景举例:

如点击广告跳转。
现有如下规则:点击广告时先判断是否满足条件A,如果满足A,则先尝试用A方式跳转,若A方式跳转失败,则再尝试B方式。

代码举例:
抽象基类: Jump.java
提供抽象方法, jump跳转,各子类根据规则各自实现不同的逻辑

public abstract class Jump {
    private Jump mNext;

    abstract boolean jump(Activity activity, MimoAdInfo adInfo);

    public void setNext(Jump next) {
        this.mNext = next;
    }


    protected void onSuccess(MimoAdInfo adInfo) {
    }

    protected void onFail(MimoAdInfo adInfo) {
    }

    public final boolean start(Activity activity, MimoAdInfo adInfo) {
        boolean success = jump(activity, adInfo);
        if (success) {
            onSuccess(adInfo);
            return true;
        }
        if (mNext != null) {
            return mNext.start(activity, adInfo);
        }
        onFail(adInfo);
        return false;
    }
}

子类: DeepLinkJump.java

public class DeepLinkJump extends Jump{
    @Override
    boolean jump(Activity activity, MimoAdInfo adInfo) {
        if (adInfo != null && !TextUtils.isEmpty(adInfo.mDeepLink)) {
            try {
                final Uri contentUrl = Uri.parse(adInfo.mDeepLink);
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_VIEW);
                intent.setData(contentUrl);
                MimoAdManager.get().trackLauchStart(adInfo);
                boolean success = IntentUtils.startActivity(activity, intent);
                return success;
            } catch (Exception e) {
                return false;
            }
        }
        return false;
    }

    @Override
    protected void onSuccess(MimoAdInfo adInfo) {
        MimoAdManager.get().trackLauchSuccess(adInfo);
    }

    @Override
    protected void onFail(MimoAdInfo adInfo) {
        MimoAdManager.get().trackLauchFail(adInfo);
    }
}

子类:LandingPageJump.java

public class LandingPageJump extends Jump{
    @Override
    public boolean jump(Activity activity, MimoAdInfo adInfo) {
        if (adInfo != null && !TextUtils.isEmpty(adInfo.mLandingPageUrl)) {
            try {
                if (adInfo.mLandingPageUrl.startsWith("http://") || adInfo.mLandingPageUrl.startsWith("https://")) {
                    LandingPageHelper.land(adInfo.mLandingPageUrl);
                } else {
                    final Uri contentUrl = Uri.parse(adInfo.mLandingPageUrl);
                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_VIEW);
                    intent.setData(contentUrl);
                    return IntentUtils.startActivity(activity, intent);
                }
            } catch (Throwable throwable) {
                return false;
            }
            return true;
        }
        return false;
    }
}

子类:FloatCardDataJump.java

public class FloatCardDataJump extends Jump{
    @Override
    boolean jump(Activity activity, MimoAdInfo adInfo) {
        if (adInfo != null && !TextUtils.isEmpty(adInfo.mFloatCardData)) {
            try {
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_VIEW);
                final Uri contentUrl = Uri.parse(adInfo.mFloatCardData);
                intent.setData(contentUrl);
                boolean success = IntentUtils.startActivity(activity, intent);
                return success;
            } catch (Exception e) {
                return false;
            }
        }
        return false;
    }
}

客户端使用代码举例:

/**
     * 点击按钮区域 先读取floatcarddata,如果取不到该字段,再读取landingpageurl
     * @param adInfo
     */
    public static boolean jumpDownloadByFloatCardDataFirst(MimoAdInfo adInfo) {
        if (adInfo != null && !TextUtils.isEmpty(adInfo.mFloatCardData)) {
            FloatCardDataJump floatCardDataJump = new FloatCardDataJump();
            floatCardDataJump.setNext(new LandingPageJump());
            return floatCardDataJump.start(DkApp.get().getTopActivity(), adInfo);
        } else {
            LandingPageJump landingPageJump = new LandingPageJump();
            return landingPageJump.jump(DkApp.get().getTopActivity(), adInfo);
        }
    }
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值