Python设计模式:策略模式

设计模式十六:策略模式

什么是策略模式

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

使用场景

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

典型案例

赶飞机,策略有三
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 False
    return True

def 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 = None
        while not word:
            word = input('Insert word (type quit to exit) >')
            if word =='quit':
                print('bye')
                return 
            strategy_picked = None
            strategies = {'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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值