设计模式

2、Swift策略模式

2017-07-12  本文已影响47人  barry

1.概述

      在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。如查找、排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…或者case等条件判断语句来进行选择。这两种实现方法我们都可以称之为硬编码,如果需要增加一种新的查找算法,需要修改封装算法类的源代码;更换查找算法,也需要修改客户端调用代码。在这个算法类中封装了大量查找算法,该类代码将较复杂,维护较为困难。如果我们将这些策略包含在客户端,这种做法更不可取,将导致客户端程序庞大而且难以维护,如果存在大量可供选择的算法时问题将变得更加严重。
<pre>
例子1:商场产品销售:可以正常价格售出,可以打折形式售出,也可以通过积分的形式,不管
哪种形式,最后要的就是一个最后的总价
</pre>

<pre>
例子2:出行旅游:我们可以有几个策略可以考虑:可以骑自行车,汽车,做火车,飞
机。每个策略都可以得到相同的结果,但是它们使用了不同的资源。选择策略的依据是费用,时
间,使用工具还有每种方式的方便程度 。
</pre>

swift策略模式.png

7.模式的组成

8.效果

Strategy模式有下面的一些优点:

Strategy模式缺点:

9.实现

抽象类

//抽象类
class CashSuper: NSObject {

    //优点1: 继承有助于析取出这些算法中的公共功能。
    //缺点2: Strategy和Context之间的通信开销,对于子类实现的通信接口(acceptCash),参数(money)可以会永远不会使用
    func acceptCash(money: Double) -> Double {
        return 0.0
    }
}

打折类(其它策略类 类似)

//打折类
class CashRebate: CashSuper {
    
    private var moneyRebate: Double = 1.0
    
    init(moneyRebate: Double) {
        
        self.moneyRebate = moneyRebate
        
        super.init()
    }

    //打折返回
    override func acceptCash(money: Double) -> Double {
        return money * moneyRebate
    }

}

上下文

//上下文
class CashContext: NSObject {

    private var cs: CashSuper!
    
    //优点4: 客户可以根据不同时间 /空间权衡取舍要求从不同策略中进行选择。
    //优点3: 将算法封装在独立的Strategy类中使得你可以独立于其Context改变它,使它易于切换、易于理解、易于扩展。
    //缺点3: 策略模式将造成产生很多策略类
    func cashContext(type: CacultorType) {
    
        switch type {
        case .Normal:
            
            cs = CashNormal()
            
            break
        case .Rebate:
            
            cs = CashRebate(moneyRebate: 0.8)
            
            break
        case .Return:
            
            cs = CashReturn(moneyCondition: 300, moneyReturn: 100)
            
            break
        }
    }
    
    //优点2: 策略以相同的方式调用所有的算法,减少客户端与算法类之间的耦合
    //传入初始金额,利用私有cs,计算最终金额
    func getResult(money: Double) -> Double {
        return cs.acceptCash(money: money)
    }

}

Github传送门

上一篇下一篇

猜你喜欢

热点阅读