移动端访问不佳,请访问我的个人博客

设计模式学习的demo地址,欢迎大家学习交流

策略模式

策略模式定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。

策略模式的组成

  • 抽象策略角色(Strategy): 策略类,通常由一个接口或者抽象类实现。
  • 具体策略角色(ConcreteStrategy):包装了相关的算法和行为。
  • 环境角色(Context):持有一个策略类的引用,最终给客户端调用。

策略模式的基本实现

上图是最基本的装饰模式的结构图,下面将用Swift代码来实现一个基本策略模式:

// 策略类,定义所有支持 的算法的公共接口
protocol Strategy {func AlgorithmInterface()
}// 具体策略类,封装了具体的算法或行为,继承于Strategy
class ConcreteStrategyA: Strategy {func AlgorithmInterface() {print("ConcreteStrategyA")}
}class ConcreteStrategyB: Strategy {func AlgorithmInterface() {print("ConcreteStrategyB")}
}class ConcreteStrategyC: Strategy {func AlgorithmInterface() {print("ConcreteStrategyC")}
}// Context上下文,用一个 ConcreteStrategy来配置,维护一个对Strategy对象的引用
class Context {var strategy: Strategy?func ContextInterface() {strategy?.AlgorithmInterface()}
}

以上代码是最简单的策略模式的实现过程,定义了一个Strategy的算法族,通过它的子类可以实现算法(AlgorithmInterface)的替换,而不会影响到客户端。

用策略模式解决实际问题(商场打折)

我们知道在商场中一般有很多打折优惠方案,类似这种问题就可以用策略模式来解决,打折不同的方案就相当于不同的策略(ConcreteStrategy),然后用一个Context类来实现不同算法的切换,下面是商场打折策略模式的实现于UML图:

以上是一个简单的商场收银系统,CashNormal为普通收费子类,CashRebate为打折收费子类,CashReturn为返利收费子类,下面是代码的实现过程:

import Foundation// 定义一个收费的策略接口
protocol CashSuper {func acceptCash(money: Double) -> Double
}// 普通收费子类
class CashNormal: CashSuper {// 正常原价返回func acceptCash(money: Double) -> Double {return money}
}// 打折收费子类
class CashRebate: CashSuper {// 折扣率private var moneyRebate: Double = 1.0init(moneyRebate: Double) {self.moneyRebate = moneyRebate}func acceptCash(money: Double) -> Double {return money*moneyRebate}
}// 返利收费子类
class CashReturn: CashSuper {// 返利要求private var moneyCondition: Double = 0// 返多少private var moneyReturn: Double    = 0init(moneyCondition: Double, moneyReturn: Double) {self.moneyCondition = moneyConditionself.moneyReturn    = moneyReturn}func acceptCash(money: Double) -> Double {var result = moneyif money >= moneyCondition {result = money - floor(money / moneyCondition) * moneyReturn}return result}
}// context类
class CashContext {private var cs: CashSuper?// 通过枚举判断使用哪种方式init(style: CashStyle) {switch style {case .normal:cs = CashNormal()case .rebate(moneyRebate: let money):cs = CashRebate(moneyRebate: money)case .return(moneyCondition: let moneyCondition, moneyReturn: let moneyReturn):cs = CashReturn(moneyCondition: moneyCondition, moneyReturn: moneyReturn)}}func getResult(money: Double) -> Double {return cs?.acceptCash(money: money) ?? 0}
}// 优惠的枚举类型
enum CashStyle {case normalcase rebate(moneyRebate: Double)case `return`(moneyCondition: Double, moneyReturn: Double)
}

下面我们测试一下代码:

let money: Double = 300
// 普通
let normal = CashContext(style: .normal)
// 打7折
let rebate = CashContext(style: .rebate(moneyRebate: 0.7))
// 满一百返20
let `return` = CashContext(style: .return(moneyCondition: 100, moneyReturn: 20))
print("普通: \(normal.getResult(money: money))")
print("打7折: \(rebate.getResult(money: money))")
print("满一百返20: \(`return`.getResult(money: money))")

下面是执行的结果:

普通: 300.0
打7折: 210.0
满一百返20: 240.0

策略模式总结

我们可以理解为策略就是用来封装算法,但在实践过程中不用那么死板,可以用来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。

以上是我对于策略模式的理解,如果有不对的地方欢迎大家交流,最后谢谢大家的阅读~~

swift设计模式学习 - 策略模式相关推荐

  1. swift设计模式学习 - 代理模式

    移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 代理模式 代理模式为其他对象提供一种代理以控制对这个对象的访问,在某些情况下,一个对象不适合或者不能直接引用另一个对象 ...

  2. 设计模式学习---策略模式

    最近在看"Head First 设计模式"这本书,便想将自己所学的记录下来以加深理解,文中肯定有许多不足之处,请各位前辈们指出. 什么是设计模式 设计模式并不是某种开发语言中的工具 ...

  3. swift设计模式学习 - 模板方法模式

    移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 模板方法模式 模板方法模式,定义一个操作中算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结 ...

  4. 设计模式学习--策略模式

    前言 使用策略模式可以代替多重if-else和switch语句,让代码维护变得更加简单,乍一看跟工厂模式一模一样,下面是个简单的例子.策略模式包含以下三种角色: 环境(Context)角色:持有一个S ...

  5. JavaScript设计模式之策略模式(学习笔记)

    在网上搜索"为什么MVC不是一种设计模式呢?"其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composi ...

  6. 换个姿势学设计模式:策略模式

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:公众号「闻人的技术博客」 前言 前段时间,接到一个 ...

  7. 策略设计模式_设计模式之策略模式总结

    再上一篇文章<设计模式之策略模式>中,我们通过模拟鸭子项目,了解了什么是策略模式,怎么使用策略模式.本文将通过鸭子项目的学习,对策略模式进行总结. 策略模式: 分别封装行为接口,实现算法族 ...

  8. 揭秘设计模式:策略模式(Strategy)的枚举(Enum)实现

    2019独角兽企业重金招聘Python工程师标准>>> 链接地址:http://www.xx566.com/detail/120.html 上一篇:揭秘设计模式:策略模式(Strat ...

  9. 设计模式之策略模式+工厂模式+模板模式结合

    设计模式之策略模式+模板模式 为什么总是学不好设计模式 从"登录功能"中发现问题. 首先我们简单的了解功能需求: 于是你开始干活了: 1.控制层代码如下,根据不同的登录方式调用不同 ...

最新文章

  1. Maya和Arnold的高级照明实践
  2. TypeScript 2.7 版本发布
  3. 打破PermGen神话
  4. 菜鸟也能搞定C++内存泄漏
  5. 尝试对知乎网验证码进行处理:
  6. 无尽列表_8号无尽征途强势来袭,碎片商店列表更新,有136皮肤碎片的笑了
  7. thinkphp自动验证分析
  8. MySQL Innodb引擎和MyIASM引擎的区别
  9. SolidWorks2021导出带材质的OBJ文件
  10. C#拾遗补阙【01】:字符串
  11. Habor 入门指南
  12. 自定义鼠标指针图案每次开机或者重启都会重置的解决办法
  13. 指派问题——匈牙利法
  14. java 控制面板,Java9 控制面板
  15. 最新UE下载地址和可使用注册码(公布)
  16. Dcloud 全栈之旅1-1 组件-基础
  17. matlab只读改为可修改,matlab – 获取绘图的只读属性名称列表
  18. 深入浅出工控机加固的那点事
  19. 树莓派4B开机自启动Python程序,发送WIFI-IP至指定邮箱
  20. 开源项目:ZXing(三)二维码解码

热门文章

  1. Cinema 4D R19 Essential Training: Motion Graphics Cinema 4D R19基本培训:动态图形 Lynda课程中文字幕
  2. 为什麽我们一般会在自增列或交易时间列上建立聚集索引
  3. 写好一份软件开发设计文档
  4. pytorch笔记 meshgrid
  5. 《男到中年,不如狗》看哭了多少中年男人与女人们
  6. gdp 栅格数据_最常用的GIS数据汇总
  7. html js图形定义,入门优雅的Mo.js(图形动画Javascript库)
  8. amd 皓龙 服务器 芯片,全面解读 关于AMD皓龙6000平台的那些事
  9. 【C语言】已知圆直径,求圆的半径、周长和面积
  10. 模型融合(智慧海洋建设为例)