设计模式十六:策略模式

什么是策略模式

鼓励使用多种算法来解决一个问题,其杀手级特性是能够在运行的时候透明地切换算法。
如果有两种算法,其中一种少量输入效果好,另一种对大量输入效果好,
则可以使用策略莫斯在运行时基于输入数据决定使用哪种算法。

使用场景

动态、透明地应用不同算法(目的相同但实现方案不同)
创建不同的样式表现,为了实现可移植性或动态地改变数据的表现
模拟:机器人行为中的所有不同之处都可以使用不同的策略来建模

典型案例

赶飞机,策略有三
1.乘坐公交或地铁,省钱
2.开车,不介意停车费
3.打车,时间紧急且没有自己的车

补充知识

选择不同排序算法的标准
1.需要排序的元素数量
2.算法的最佳/平均/最差时间复杂度
3.算法的空间复杂度
4.算法的稳定性
5.算法的代码实现复杂度

实例代码

# 实现检测在一个字符串中是否所有字符都是唯一的import time
SLOW = 3 # 3秒
LIMIT = 5 # 5个字符
WARNING = 'too bad,you picked the slow algorithm :('def pairs(seq): # 返回所有相邻字符对的一个序列n = len(seq)for i in range(n):yield seq[i],seq[(i+1)%n]def allUniqueSort(s):  # 如果超过5个字符,则运行缓慢if len(s) > LIMIT:print(WARNING)time.sleep(SLOW)srtStr = sorted(s)for (c1,c2) in pairs(srtStr):if c1 == c2:return Falsereturn Truedef allUniqueSet(s): # 如果小于5个字符,则运行缓慢if len(s) < LIMIT:print(WARNING)time.sleep(SLOW)return True if len(set(s)) == len(s) else False def allUnique(s,strategy):return strategy(s)def main():while True:word = Nonewhile not word:word = input('Insert word (type quit to exit) >')if word =='quit':print('bye')return strategy_picked = Nonestrategies = {'1':allUniqueSet,'2':allUniqueSort}while strategy_picked not in strategies.keys():strategy_picked = input('Choose strategy :[1] Use a set,[2] Sort and Insert pair >')try:strategy = strategies[strategy_picked]print('allUnique({}):{}'.format(word,allUnique(word,strategy)))except KeyError as err:print('Incorrect option: {}'.format(strategy_picked))print()if __name__ == "__main__":main()

Python设计模式:策略模式相关推荐

  1. Python设计模式-策略模式

    Python设计模式-策略模式 代码基于3.5.2,代码如下; #coding:utf-8 #策略模式class sendInterface():def send(self,value):raise ...

  2. Python设计模式-建造者模式

    Python设计模式-建造者模式 代码基于3.5.2,代码如下; #coding:utf-8 #建造者模式 class Burger():name = ""price = 0.0d ...

  3. Python设计模式-状态模式

    Python设计模式-状态模式 代码基于3.5.2,代码如下; #coding:utf-8 #状态模式class state():def writeProgram(self,work):raise N ...

  4. Python设计模式-备忘录模式

    Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...

  5. Python设计模式-解释器模式

    Python设计模式-解释器模式 代码基于3.5.2,代码如下; #coding:utf-8 #解释器模式class PlayContext():play_text = Noneclass Expre ...

  6. Python设计模式-命令模式

    Python设计模式-命令模式 代码基于3.5.2,代码如下; #coding:utf-8 #命令模式class barbecuer():def bakeButton(self):print(&quo ...

  7. Python设计模式-外观模式

    Python设计模式-外观模式 代码基于3.5.2,代码如下; #coding:utf-8 # 外观模式class AlarmSensor:def run(self):print("Alar ...

  8. Python设计模式-桥接模式

    Python设计模式-桥接模式 基于Python3.5.2,代码如下 #coding:utf-8class Shape():name = ""param = "" ...

  9. Python设计模式-代理模式

    Python设计模式-代理模式 基于Python3.5.2,代码如下 #coding:utf-8info_struct = dict() info_struct["addr"] = ...

  10. 关于设计模式——策略模式-Strategy Pattern

    文章目录 1 策略模式 1.1 模拟鸭子 1.2 设计原则 1.3 整合行为 1.4 模拟鸭子代码的代码 1.5 动态设定行为 1.6 重新查看整体 1.7 继承和组合 1.8 总结 1.9 优劣期间 ...

最新文章

  1. UVa 10047,独轮车
  2. 这回真的是挤时间了-PHP基础(三)
  3. PHP多选题怎么弄,php多选题评分算法求指导解决方法
  4. 苹果开发几个常见的错误
  5. 腾讯 AngelFL 联邦学习平台揭秘
  6. WebRTC第六步:下载webrtc
  7. Android颜色渐变的分隔线(ListView)
  8. 基于阿里云实现游戏数据运营(附Demo)
  9. js与flash结合使用
  10. 进入路由器boot的方式
  11. 查看文章strncpy()功能更好的文章
  12. 第1章 异常产生异常处理
  13. iPhone 开源游戏引擎
  14. js控制layui radio button选中
  15. 程序员的需要掌握的数学知识
  16. 在Ubuntu 20.04(含Xubuntu、Linux Mint Cinnamon等衍生版)上安装Wine QQ,获得更佳的使用体验
  17. html当当网上书店,当当网上书店案例代码+css+js+images
  18. Three.js学习笔记①---搭建本地three.js官网(来自B站老陈视频)
  19. 随机森林和多元线性回归R语言实现代码
  20. JDBC中的DBUtil工具和druid连接池相关代码实例

热门文章

  1. xtu DP Training C.炮兵阵地
  2. Tensorflow API(一)
  3. mysql 1064 update_MySQL更新错误#1064
  4. python 英文字典-python如何制作英文字典
  5. vscode调试时如何在launch.json中添加环境变量
  6. 使用Bind配置DNS Load Balancing
  7. VS中依赖库相对路径的配置及项目间依赖项
  8. 美国能限制linux内核,美国大学教授「故意」向 Linux 提交含 Bug 代码,内核管理员“封杀”明尼苏达大学...
  9. stosb, stosw, stosd 汇编指令
  10. 成都电子地图 高清15、17、19级别 谷歌电子地图资源