策略模式

2018-03-14  本文已影响0人  afander

引子

最近在设计广告的SDK,对一些模式进行了探究。这里根据实际的问题,从策略模式做出一个总结。

需求

广告模块是公司的变现模块,非常重要,目前公司iOS这块有十来个APP。广告模块承担了从第三方SDK或者直投拿广告然后以返回广告数据到APP的中介作用。目前是要把这个模块彻底抽出来,做成SDK。

需求分析

功能看起来没有多复杂,只是数据的请求和回调。然而,这个架构的设计上就有一些坑点。

策略模式的引入

我们集成SDK 本质的作用是拉取广告数据,而我们的目的是实现一系列第三方SDK的接入,并且可以在第三方SDK之间进行切换,无论加多少,我们都可以不修改之前的代码,只是扩展。这就是开闭原则。这里就需要用到一个设计模式——策略模式。

策略模式

引用一个流传特别广泛的图


策略模式.jpg

在strategy中有一系列的协议方法实现,在不同的策略中有不同的实现,实际上,context中保存了策略的指针,策略就是由这个指针来选择的。可以看到,strategyA,strategyB,strategyC 实现了同样的算法,我们可以在三个策略之间随意的切换。再增加一个strategyD的话也只是一个扩展而已,并没有修改其他组件的代码。这里的算法如果有需要的话,还可以复用,因为它们是独立的。

策略模式的使用

由于具体的代码还没有成型,在这里只贴出一部分的简易的代码。 类结构
protocl

Context需要连接三个SDK:A、B、C,中的一个,SDK在目录中的FLASDK,FLBSDK,FLCSDK类中集成,而这三个类实现了FLSDKDelegate中的协议方法。无论中间代码实现是什么,都实现了方法getSDKVersion,这里,外界就不关心你怎么实现的,集成的那个SDK,只需要调用这个方法就可以拿到所需要的数据。

Context实现 调用过程

总结

这样以来,无论以后我们要接入多少个第三方的SDK,只要在增加一个strategyX,并在里面实现了数据请求的接口,就可以调用了。扩展性非常好。

  备注:刚开始写文章,逻辑不是很顺畅。有人看的话,并且看出问题的话,请不吝指正,多谢。
上一篇下一篇

猜你喜欢

热点阅读