项目接入同类型的多个第三方sdk的方法-低耦合,可扩展
Posted 黄毛火烧雪下
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目接入同类型的多个第三方sdk的方法-低耦合,可扩展相关的知识,希望对你有一定的参考价值。
目录
一、背景
目前,下载量比较大的项目,一般都会接入第三方广告平台,来提高产品收益,有时候就会接入多个第三方广告平台,进行对比,哪个平台的广告收益多。问题来了,是不是每接入一个广告平台,都要复制一份代码呢,代码怎么具有可维护性和可扩展性?
二、解决方案
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的方法-低耦合,可扩展的主要内容,如果未能解决你的问题,请参考以下文章