《设计模式:可复用面向对象软件的基础》一书的作者指出:“策略对象通常是很好的享元(flyweight)。” “享元”定义:“享元是可共享的对象,可以同时在多个上下文中使用。” 共享是推荐的做法,这样不必在每个新的上下文中使用相同的策略时不断新建具体策略对象,从而减少消耗。因此,为了避免“策略”模式的一个缺点(运行时消耗)

具体策略一般没有内部状态,只是处理上下文中的数据。此时,一定要使用普通的函数,别去编写只有一个方法的类,再去实现另一个类声明的单函数接口。函数比用户定义的类的实例轻量,而且无需使用“享元”模式,因为各个策略函数在 Python 编译模块时只会创建一次。普通的函数也是“可共享的对象,可以同时在多个上下文中使用”。

globals()
返回一个字典,表示当前的全局符号表。这个符号表始终针对当前模块(对函数或方
法来说,是指定义它们的模块,而不是调用它们的模块)。

“命令”模式的目的是解耦调用操作的对象(调用者)和提供实现的对象(接收者)。调用者是图形应用程序中的菜单项,而接收者是被编辑的文档或应用程序自身。

inspect.getmembers 函数用于获取对象(这里是 promotions模块)的属性,第二个参数是可选的判断条件(一个布尔值函数)。我们使用的是 inspect.isfunction,只获取模块中的函数。

把实现单方法接口的类的实例替换成可调用对象。毕竟,每个Python 可调用对象都实现了单方法接口,这个方法就是 __call__。

评论