python 设计模式之策略模式
这几天太忙了,都没空写,所以持续了好几天。
1.策略模式的定义:
策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
通俗的讲,也就是将那些使用的方法风别封装成独立的类,然后将这一类使用接口统一管理起来,让需要使用这些方法的用户能够随时调用他们。
2.策略模式的结构
3.策略模式的使用场景
- 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
- 一个系统需要动态地在几种算法中选择一种。
4. 策略模式的优点
-
算法可以自由切换
-
改一下策略很方便
-
-
扩展性良好
-
增加一个策略,就多增加一个类就好了。
-
5.策略模式的缺点
(被赞美着的往往也就是被绑架着的,有优点必有缺点)
-
策略类的数量增多
-
每一个策略都是一个类,复用的可能性很小、类数量增多
-
-
所有的策略类都需要对外暴露
-
上层模块必须知道有哪些策略,然后才能决定使用哪一个策略
-
6.令人想不明白的地方是:
策略模式还有一个Context上下文对象。这对象是用来干什么的呢?
《设计模式之禅》:
Context叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。
说白了,通过Person来调用更符合面向对象(屏蔽了直接对具体实现的访问)。
首先要明白一个道理,就是——到底是 “人” 旅游,还是火车、汽车、自行车、飞机这些交通工具旅游?
如果没有上下文的话,客户端就必须直接和具体的策略实现进行交互了,尤其是需要提供一些公共功能或者是存储一些状态的时候,会大大增加客户端使用的难度;引入上下文之后,这部分工作可以由上下文来完成,客户端只需要和上下文进行交互就可以了。这样可以让策略模式更具有整体性,客户端也更加的简单
https://www.zhihu.com/question/31162942
7.举个例子
参考
http://www.imooc.com/article/270302
https://www.cnblogs.com/onepiece-andy/p/python-strategy.html
https://segmentfault.com/a/1190000011918366
https://www.jianshu.com/p/c59d75de1c54
https://www.cnblogs.com/whgk/p/6087064.html