Android设计模式 -- 巧用策略模式告别过多的 if...else...

背景描述

根据后台配置进行不同的广告加载策略,例如有广告 A / B / C,某个时段后台配置播放广告 C,默认播放 A;

普通的实现方式

  • 创建广告管理类,实现广告加载/播放的控制:
class AdManager(adName: String) {
    var ad = adName
    fun initAd() {
        when (ad) {
            "A" -> initA()
            "B" -> initB()
            "C" -> initC()
        }
    }

    fun playAd() {
        when (ad) {
            "A" -> initA()
            "B" -> initB()
            "C" -> initC()
        }
    }

    fun stopAd() {"A"
        when (ad) {
            "A" -> initA()
            "B" -> initB()
            "C" -> initC()
        }
    }

    private fun initA() {
        print("init A")
    }
    // 代码省略...

    private fun playA() {
        print("play A")
    }
    // 代码省略...

    private fun stopA() {
        print("stop A")
    }
    // 代码省略...
}
  • 使用方式:
class ConcreteAd {
    fun main() {
        var adManager = AdManager("A")
        adManager.initAd()
        adManager.playAd()
        adManager.stopAd()
    }
}
  • 缺点:从上面看到,充斥着大量的if…else…(Kotlin 中用的 when 语法),并且耦合度很高,想要增加广告就要在同一个类中进行修改。

策略模式

那么使用策略模式来进行优化后,大致是这样的:

  • 创建广告策略接口 IAdStrategy 类:
interface IAdStrategy {
    abstract fun initAd()
    abstract fun playAd()
    abstract fun stopAd()
}
  • 针对不同的广告进行策略的实现(下面以广告A为例):
class A : IAdStrategy {
    override fun initAd() {
        print("init A")
    }

    override fun playAd() {
        print("play A")
    }

    override fun stopAd() {
        print("stop A")
    }
}
  • 创建策略相关的Context来绑定广告和策略接口之间的关系:
class AdStrategyContext {

    private lateinit var mAdStrategy: IAdStrategy

    constructor(adStrategy: IAdStrategy) {
        this.mAdStrategy = adStrategy
    }

    fun initAd() {
        mAdStrategy.initAd()
    }

    fun playAd() {
        mAdStrategy.playAd()
    }
}
  • 使用方式:
class ConcreteAd {
    fun main() {
        // 普通
        var adManager = AdManager("A")
        adManager.initAd()
        adManager.playAd()
        adManager.stopAd()

        // 策略模式
        var adCtx  = AdStrategyContext(A())
        adCtx.initAd()
        adCtx.playAd()
        adCtx.stopAd()
    }
}
  • 优点:上面可以看到,一旦需要增加广告D的话,去实现对应的 IAdStrategy 接口即可,和之前的代码没有耦合,符合设计原则。
  • 缺点:如果广告很多的话,会存在很多类文件,并且一旦接口需要补充和修改,那么所有的实现类都会变动。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值