需求
根据后台配置进行不同的广告加载策略,例如有广告 A / B / C,某个时段后台配置播放广告 C,默认播放 A;
普通的实现方式
- 创建广告管理类,实现广告加载/播放的控制:
1 | class AdManager(adName: String) { |
- 使用方式:
1 | class ConcreteAd { |
从上面看到,充斥着大量的if…else…(Kotlin 中用的 when 语法),并且耦合度很高,想要增加广告就要在同一个类中进行修改。那么使用策略模式来进行优化后,大致是这样的:
- 创建广告策略接口 IAdStrategy 类:
1 | interface IAdStrategy { |
- 针对不同的广告进行策略的实现(下面以广告A为例):
1 | class A : IAdStrategy { |
- 创建策略相关的Context来绑定广告和策略接口之间的关系:
1 | class AdStrategyContext { |
- 使用方式:
1 | class ConcreteAd { |
上面的例子可以看到,一旦需要增加广告D的话,去实现对应的 IAdStrategy 接口即可,和之前的代码没有耦合,符合设计原则。但缺点就是如果广告很多的话,会存在很多类文件,并且一旦接口需要补充和修改,那么所有的实现类都会变动。