《王者荣耀》中程序24种设计模式之奥义第四式·策略模式

102 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

由来

当你还是一个码农的时候,每天都要编写多少行代码每次都要创建很多类的时候,每建立一次给你一点经验值,累计到十级的时候会发现我写了这很多代码为什么不能复用呢?
这时恭喜您进入转职阶段,由码农转成会放魔法的码农。。。(多么吊炸天技能)
觉醒吧!少年。
以王者荣耀为示例题材,写代码就是打游戏!
复制代码

上一篇:抽象工厂模式

抽象工厂模式:juejin.cn/post/708998…

入口

代码示例裢接:github.com/ruanch/Desi…

进入正题(商店的优惠策略

玩游戏你会发现,商店里部分英雄会有打九折英雄,有18888金币立减到13888金币这样的活动。活动过后又恢复正常了。
首先我们先考虑如何抽象,每一个活动当成一种策略。
    class GoldStrategy: NSObject {

    func acceptGold(gold: Float) -> Float{

        return 0

    }

}
接下来我们三种策略:正常价格打九折18888立减5000
class GoldStrategyNormal: GoldStrategy {

    override func acceptGold(gold: Float) -> Float {

        return gold

    }

}
class GoldStrategyRobate: GoldStrategy {

    override func acceptGold(gold: Float) -> Float {

        return gold * 0.9

    }

}

class GoldStrategyReturn: GoldStrategy {

    override func acceptGold(gold: Float) -> Float {

        return gold - 5000.0

    }

}
***接下来如何应用三种策略切换,用一个Context类来处理,此处你会发现这个模式跟简单工厂类很像。***
enum GoldType: Int{

    case GoldTypeNormal = 0

    case GoldTypeRobate

    case GoldTypeReturn

}

class GoldContext: NSObject {

    var stragy: GoldStrategy //相比简单工厂区别,不在客户端里产生实例,在类的属性。

    init(type: GoldType){

        switch type {

        case .GoldTypeNormal:

            stragy = GoldStrategyNormal()

        case .GoldTypeRobate:

            stragy = GoldStrategyRobate()

        case .GoldTypeReturn:

            stragy = GoldStrategyReturn()

        }

    }

    func getResult(gold: Float) -> Float {

       return stragy .acceptGold(gold: gold)

    }

}

客户端的调用:

***//正常的英雄价格***

        let context: GoldContext = GoldContext(type: .GoldTypeNormal)

        let resultNormal = context.getResult(gold: 18888.0)

        print("策略一:\(resultNormal)")

        //打过九折的价格

        let context1: GoldContext = GoldContext(type: .GoldTypeRobate)

        let resultRobate = context1.getResult(gold: 18888.0)

        print("策略二:\(resultRobate)")

        //18888立减5000到13888

        let context2: GoldContext = GoldContext(type: .GoldTypeReturn)

        let resultReturn = context2.getResult(gold: 18888.0)

        print("策略三:\(resultReturn)")

输出信息:

策略一:18888.0

策略二:16999.2

策略三:13888.0

总结

***简单工厂VS策略模式的区别***
    简单工厂重在实例的生成,在客户端里会有工厂类和实例类相对耦合高
    策略模式客户端只认识context实例,耦合降低
    策略工厂关系图:

image.png