引子
最近在设计广告的SDK,对一些模式进行了探究。这里根据实际的问题,从策略模式做出一个总结。
需求
广告模块是公司的变现模块,非常重要,目前公司iOS这块有十来个APP。广告模块承担了从第三方SDK或者直投拿广告然后以返回广告数据到APP的中介作用。目前是要把这个模块彻底抽出来,做成SDK。
需求分析
功能看起来没有多复杂,只是数据的请求和回调。然而,这个架构的设计上就有一些坑点。
- 首先就是当前我们接入的第三方SDK 只有两个,但是,几乎可以确定的是,后期会增加。
- 然后,由于广告模块的重要性,拉取物料失败后要有个"补余"操作。这个"补余"策略。
策略模式的引入
我们集成SDK 本质的作用是拉取广告数据,而我们的目的是实现一系列第三方SDK的接入,并且可以在第三方SDK之间进行切换,无论加多少,我们都可以不修改之前的代码,只是扩展。这就是开闭原则。这里就需要用到一个设计模式——策略模式。
策略模式
引用一个流传特别广泛的图
在strategy中有一系列的协议方法实现,在不同的策略中有不同的实现,实际上,context中保存了策略的指针,策略就是由这个指针来选择的。可以看到,strategyA,strategyB,strategyC 实现了同样的算法,我们可以在三个策略之间随意的切换。再增加一个strategyD的话也只是一个扩展而已,并没有修改其他组件的代码。这里的算法如果有需要的话,还可以复用,因为它们是独立的。
策略模式的使用
由于具体的代码还没有成型,在这里只贴出一部分的简易的代码。Context需要连接三个SDK:A、B、C,中的一个,SDK在目录中的FLASDK,FLBSDK,FLCSDK类中集成,而这三个类实现了FLSDKDelegate中的协议方法。无论中间代码实现是什么,都实现了方法getSDKVersion,这里,外界就不关心你怎么实现的,集成的那个SDK,只需要调用这个方法就可以拿到所需要的数据。
总结
这样以来,无论以后我们要接入多少个第三方的SDK,只要在增加一个strategyX,并在里面实现了数据请求的接口,就可以调用了。扩展性非常好。
备注:刚开始写文章,逻辑不是很顺畅。有人看的话,并且看出问题的话,请不吝指正,多谢。