设计模式十六:策略模式
什么是策略模式
鼓励使用多种算法来解决一个问题,其杀手级特性是能够在运行的时候透明地切换算法。
如果有两种算法,其中一种少量输入效果好,另一种对大量输入效果好,
则可以使用策略莫斯在运行时基于输入数据决定使用哪种算法。
使用场景
动态、透明地应用不同算法(目的相同但实现方案不同)
创建不同的样式表现,为了实现可移植性或动态地改变数据的表现
模拟:机器人行为中的所有不同之处都可以使用不同的策略来建模
典型案例
赶飞机,策略有三
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()