策略模式

大多数问题都可以使用多种方法来解决。以排序问题为例,对于以一定次序把元素放入一个列表,排序算法有很多。
通常来说,没有工人最适合所有场景的算法。
需要考虑的元素数量
算法最佳、平均、最差时间复杂度
算法的空间复杂度
算法的稳定性
算法的代码实现复杂度
策略模式鼓励用多种算法来解决一个问题,其杀手级特性是能够在运行时透明地切换算法(客户端代码对变化无感知)。
因此,如果你有两种算法,并且知道其中对少量输入效果更好,另一种对大量输入效果更好,
则可以适用策略模式在运行时基于输入数据决定使用哪种算法。
python的sorted()和li.sort()函数是策略模式的例子。
两个函数都接受一个命名参数key,这个参数本质上是实现了一个排序策略的函数的名称

按字母顺序排列
基于TIOBE排序

import pprint        # 美化输出
from collections import namedtuple        # 通过属性名访问class或namedtuple
from operator import attrgetter

if __name__ == '__main__':
    ProgrammingLang = namedtuple('ProgrammingLang', 'name ranking')
    stats = (('Ruby', 14), ('Javascript', 8), ('Python', 7),
             ('Scala', 31), ('Swift', 18), ('Lisp', 23))
    lang_stats = [ProgrammingLang(n, r) for n, r in stats]
    pp = pprint.PrettyPrinter(indent=5)
    pp.pprint(sorted(lang_stats, key=attrgetter('name')))
    print()
    pp.pprint(sorted(lang_stats, key=attrgetter('ranking')))

 

检测一个字符串中是否所有字符都是唯一的
1、先排序
2、判断是否相邻的相同
import time

SLOW = 3  # 单位为秒
LIMIT = 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):
    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):
    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 pair> ')

                try:
                    strategy = strategies[strategy_picked]
                    print('allUnique({}): {}'.format(word, allUnique(word, strategy)))
                except KeyError as err:
                    print('Incorrect option: {}'.format(strategy_picked))


if __name__ == '__main__':
    main()

 

posted @ 2018-12-18 13:45  慕沁  阅读(130)  评论(0)    收藏  举报