本文已参与「新人创作礼」活动,一起开启掘金创作之路
由来
当你还是一个码农的时候,每天都要编写多少行代码每次都要创建很多类的时候,每建立一次给你一点经验值,累计到十级的时候会发现我写了这很多代码为什么不能复用呢?
这时恭喜您进入转职阶段,由码农转成会放魔法的码农。。。(多么吊炸天技能)
觉醒吧!少年。
以王者荣耀为示例题材,写代码就是打游戏!
复制代码
上一篇:抽象工厂模式
抽象工厂模式: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实例,耦合降低
策略工厂关系图: