背景介绍
为满足开屏控件能动态调整属性,以快速实验出能触发开屏CTR的正向方案。 现阶段,将「开屏点击按钮」、「退出按钮」、「广告标」等常用元素进行动态化配置。
基于该流程,进行了初版设计,主要是为了兼容两种开屏类型
原版设计api调用:
//业务层获得接口,普通开屏传true,超级首映传false
ILaunchDynamic launchDynamic = LaunchDynamicFactory.getLaunchDynamic(true);
//检查数据合法性
launchDynamic.initDefaultValue(advert,fullScreen);
//点击按钮
launchDynamic.clickButtonDynamic(rootView,clickBtn,data);
//广告标
launchDynamic.adTagDynamic(rootView,data,true);
//跳过按钮
launchDynamic.skipButtonDynamic(rootView,skipBtn,data);
设计优点:
1.能兼容到普通开屏与超级首映,最大化复用公共部份
2.业务层只持有 「ILaunchDynamic」接口,符合「依赖倒置」原则
设计缺陷:
1.该业务需要扩展其它动态化控件时,不可必免会侵入到接口类*「ILaunchDynamic」,抽象基类「AbstractLaunchDynamic」,随着业务叠加,不停侵入老业务,抽象基类不可避免的会发生爆炸,不符合「开闭原则」*
基于上述缺陷,进行了符合设计原则的演进:
演进版设计业务层api调用:
点击按钮:
LaunchViewStory.with(rootView)
.clickBuilder(asset.uiClickButton)
.injectClickButton(clickLayout)
.injectClickTextView(clickLayoutText)
.injectClickArrowView(ivClickIcon)
.fullScreen(isFullScreen())
.launch();
跳过按钮
LaunchViewStory.with(rootView)
.skipBuilder(asset.uiSkipButton)
.injectSkipButton(skipBtnHotZone)
.injectSkipTextView(btnSkip)
.launch();
广告标
LaunchViewStory.with(rootView)
.tagBuilder(asset.uiAdTag)
.displayAdvertisingTag(displayAdvertisingTag)
.launch();
当然,也可以直接链式调用写完,只需要中间隔一个 then() 操作符即可:
LaunchViewStory.with(rootView)
.clickBuilder(asset.uiClickButton)
.injectClickButton(clickLayout)
.injectClickTextView(clickLayoutText)
.injectClickArrowView(ivClickIcon)
.fullScreen(isFullScreen())
.then()
.skipBuilder(asset.uiSkipButton)
.injectSkipButton(skipBtnHotZone)
.injectSkipTextView(btnSkip)
.then()
.tagBuilder(asset.uiAdTag)
.displayAdvertisingTag(displayAdvertisingTag)
.launch();
演进版设计类图
设计优点:
1.当有新增组件动态化业务时,可以做到完全不侵入已有动态化逻辑,只需要新增相应的 Builder & Worker,注册进FcntionManager即可,符合「开闭原则」,且Builder可以统管各控件之间的位置关系(如果存在位置关系的话)
2.支持业务层链式调用,逻辑更加清晰