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

Posted 黄毛火烧雪下

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目接入同类型的多个第三方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()
    }
}

 

以上是关于项目接入同类型的多个第三方sdk的方法-低耦合,可扩展的主要内容,如果未能解决你的问题,请参考以下文章

直播SDK要怎样接入?

手机游戏渠道SDK接入工具项目分享拨开云雾是个坑

鸭子类型

什么是耦合?解耦合的方法有哪几种?

sdk平台是啥意思,接入sdk是啥意思

接入第三方sdk但是找不到aar里面的类