你这个例子是直接把代表不同行为的函数指针保存在类成员中,然后来调用之,感觉上倒和 C# 的 delegate 有类似之处。按照策略模式的本意是需要设计策略的基类(接口),再定义具体策略类。然后客户对象中可以动态加载不同的具体策略类来实现策略的切换。如果从 OO 设计的角度讲,是不鼓励用 delegate 的,因为一般来说 delegate 比较具有侵入性。
从反面来讲,我在 C# 中也非常喜欢用 delegate, 匿名函数这些特性。因为更灵活。
而动态语言如 Python/IronPython 就更爽了,对动态语言来说,如果要实现一些静态 OO 语言里面的模式,感觉都没啥必要原样照搬,因为一般都有简洁的多的方式来实现。
个人觉得动态语言更体现了“约定优于配置”的原则,从而生产力更高。
这就是动态语言啊,相当于保留函数指针。
C#里面很向函数指针的是什么的呢?就是delegate。
而delegate的典型应用是什么呢?就是事件机制。
那么Java里的事件机制是怎么做到的呢?就是定义EventListener然后实现相应的方法。这就是和那个OO的Duck类似的实现了,一个Duck和一个EventListener在这个方面有些接近。
如果不熟悉Java的Event Listener的话也可以用传统的Observer模式来看,而且其实Event Listener等等,其实不就是用了Observer模式嘛。
@Jeffrey Zhao
没错,这就是动态语言的优势,让实现变得更加直接了当。
其实你这里所展示的并未完全发挥动态语言的灵活性。
动态语言的精髓在于 duck typing 。
恰巧我刚写了篇简单的 duck typing 介绍:
http://docs.google.com/View?docid=dczg8vtk_18gxgvgq
语言级别的动态?虽然灵活。
但是估计设计图会让人看的晕死。。。
Python还挺简单的。。。不过我还没有机会用过呢!