项目接入同类型的多个第三方sdk的方法-低耦合,可扩展

目录

 

一、背景

二、解决方案

三、Test.kt

四、TestHelp.kt

五、ExternalAdAccessor

六、XiyuAdAccessor


一、背景

       目前,下载量比较大的项目,一般都会接入第三方广告平台,来提高产品收益,有时候就会接入多个第三方广告平台,进行对比,哪个平台的广告收益多。问题来了,是不是每接入一个广告平台,都要复制一份代码呢,代码怎么具有可维护性和可扩展性?

二、解决方案

Test 主类

TestHelpImpl类 实现 TestHelp 接口

AdStatusCallback 作为Test 调用 TestHelpImpl 的回调接口

ExternalAccessor (对象申明,单例)作为连接第三方广告的 中转站

XiyuAccessor(对象申明,单例) 为第三方广告的某一个厂商

OnExternalAdListener 接口作为 TestHelpImpl、  ExternalAccessor 、XiyuAccessor 传递参数

三、Test.kt

fun main(args: Array<String>) {

    Test().getInfo()
}

class Test : AdStatusCallback {

    //by lazy是通过属性代理来实现的懒加载,只在第一次使用的时候才会去执行表达式,并且只会执行一次。
    // by lazy默认是线程安全的,内部通过双重判断锁来保证只执行一次代码块赋值
    //当能够确定不会发生在多线程中的时候,可通过lazy(LazyThreadSafetyMode.NONE) { ... }来避免加锁。

    private val testHelper: TestHelper by lazy(LazyThreadSafetyMode.NONE) { TestHelper() }

    fun getInfo() {

        //调用外部广告方法
        testHelper.apply {

            //通过回调方法将 Test 和 TestHelper 关联上
            registerCallback(this@Test)

        }.showExternalAd()
    }

    /**
     * 调用外部广告返回成功方法
     */
    override fun onAdLoadSuccess() {
        super.onAdLoadSuccess()
        print("主页接收到了返回值")
    }

}

四、TestHelp.kt

/*Test帮助接口*/
interface TestHelper {

    //获取外部第三方广告
    fun showExternalAd()

    //注册接口
    fun registerCallback(callback: AdStatusCallback): TestHelper
    //伴生对象:类内部的对象声明可以用 companion 关键字标记
    companion object {
        operator fun invoke(): TestHelper = TestHelperImpl()
    }
}

/**
 * 具体要用到广告状态返回接口
 */
interface AdStatusCallback {

    fun onAdLoadSuccess() {}
}

/*Test实现类*/
private class TestHelperImpl : TestHelper {

    private var callback: AdStatusCallback? = null

    override fun registerCallback(callback: AdStatusCallback): TestHelper {
        this.callback = callback
        return this
    }

    override fun showExternalAd() {
        /**
         * 请求第三方广告
         */
        ExternalAdAccessor.requestSplashAd("11", object : ExternalAdAccessor.OnExternalAdListener<Unit> {
            override fun onAdLoaded() {
                super.onAdLoaded()
                callback?.onAdLoadSuccess()
            }
        })

    }
}

五、ExternalAdAccessor

object ExternalAdAccessor {
    fun requestSplashAd(
            positionId: String,
            listener: OnExternalAdListener<Unit>? = null
    ) {
        //在这里 可以处理多个第三方广告比如ADView、赋能广告 if(){}else{}
        XiyuAdAccessor.requestSplashAd(positionId, listener)
    }

    /**
     * 第三方广告返回接口定义
     */
    interface OnExternalAdListener<T> {
        /**
         * 广告资源载入成功
         */
        fun onAdLoaded() {}

        /**
         * 收到广告数据
         */
        fun onAdReceived(ads: T) {}

        /**
         * 广告发生错误
         */
        fun onAdError() {}

        /**
         * 视频完成
         */
        fun onVideoFinished() {}
    }
}

六、XiyuAdAccessor

/**
 * 赋能广告处理类
 */
object XiyuAdAccessor {
    fun requestSplashAd(
            positionId: String,
            listener: ExternalAdAccessor.OnExternalAdListener<Unit>?
    ){
        listener?.onAdLoaded()
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄毛火烧雪下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值