Spiga

不谈模式,只谈实现

2007-02-07 01:01 by FantasySoft, 3135 visits, 收藏, 编辑
        回到家已经很晚了,还是很习惯性的上上博客园,看看大家一天精彩的文章,以求擦出些智慧的火花,让不太灵光的脑袋能够变得聪明些。这不,Justin兄的文章让我惺松的睡眼有了亮光。Justin的文章讲的是Strategy Pattern(策略模式),内容十分生动,让人看了之后对这个模式有了清晰的认识。而我也心痒痒的,想写些读后感什么的,咔咔~~

        说句实在话,我对模式了解得很少,策略模式也是听得多,用得少(这样写是为了顺口,估计连用都没用过吧)。针对Justin在文中提到的可爱人物——Joe遇到的问题,我用IronPython(Python)写了如下的代码,我想这样的解决方案会来得更加直接吧。
        首先,我定义一个鸭子的原型:
>>> class Duck:
    
def fly(self):
        
pass
    
def quack(self):
        
pass

        接着,我再定义两种飞的行为:
>>> def failToFly(arg):
     
print "I can't fly."

>>> def ableToFly(arg):
     
print "I can fly."



        最后,我定义RubberDuck和RedHeadDuck:
>>> class RubberDuck(Duck):
     Duck.fly 
= failToFly


>>> class RedHeadDuck(Duck):
     Duck.fly 
= ableToFly

         好,大功告成!让我们检验一下这两种鸭子是不是真的“飞”得其所:
>>> a = RubberDuck()
>>> a.fly()
I can
't fly.

>>> b = RedHeadDuck()
>>> b.fly()
I can fly.

        果然,该飞的能飞了,不该飞的还是乖乖地呆着。至于Quack方法的实现,我们也可以使用类似的方式,在这里就不赘述了。
Add your comment

9 条回复

  1. #1楼 木野狐      2007-02-07 02:39
    你这个例子是直接把代表不同行为的函数指针保存在类成员中,然后来调用之,感觉上倒和 C# 的 delegate 有类似之处。按照策略模式的本意是需要设计策略的基类(接口),再定义具体策略类。然后客户对象中可以动态加载不同的具体策略类来实现策略的切换。如果从 OO 设计的角度讲,是不鼓励用 delegate 的,因为一般来说 delegate 比较具有侵入性。

    从反面来讲,我在 C# 中也非常喜欢用 delegate, 匿名函数这些特性。因为更灵活。
    而动态语言如 Python/IronPython 就更爽了,对动态语言来说,如果要实现一些静态 OO 语言里面的模式,感觉都没啥必要原样照搬,因为一般都有简洁的多的方式来实现。
    个人觉得动态语言更体现了“约定优于配置”的原则,从而生产力更高。
     回复 引用 查看   
  2. #2楼 Justin      2007-02-07 09:32
    有空要多来跟你学学IronPython~
     回复 引用 查看   
  3. #3楼 dd [未注册用户]2007-02-07 09:50
    有什么好说的呢??
     回复 引用   
  4. #4楼 Jeffrey Zhao      2007-02-07 11:11
    这就是动态语言啊,相当于保留函数指针。
    C#里面很向函数指针的是什么的呢?就是delegate。
    而delegate的典型应用是什么呢?就是事件机制。
    那么Java里的事件机制是怎么做到的呢?就是定义EventListener然后实现相应的方法。这就是和那个OO的Duck类似的实现了,一个Duck和一个EventListener在这个方面有些接近。
    如果不熟悉Java的Event Listener的话也可以用传统的Observer模式来看,而且其实Event Listener等等,其实不就是用了Observer模式嘛。
     回复 引用 查看   
  5. #5楼[楼主] FantasySoft      2007-02-07 11:38
    @Jeffrey Zhao

    没错,这就是动态语言的优势,让实现变得更加直接了当。
     回复 引用 查看   
  6. #6楼 huangyi[未注册用户]2007-02-07 19:55
    其实你这里所展示的并未完全发挥动态语言的灵活性。
    动态语言的精髓在于 duck typing 。
    恰巧我刚写了篇简单的 duck typing 介绍:http://docs.google.com/View?docid=dczg8vtk_18gxgvgq
     回复 引用   
  7. #7楼 charleschen      2007-02-07 19:56
    语言级别的动态?虽然灵活。
    但是估计设计图会让人看的晕死。。。
     回复 引用 查看   
  8. #8楼 daya[未注册用户]2007-02-09 16:59
    Python还挺简单的。。。不过我还没有机会用过呢!
     回复 引用   
  9. #9楼 readroom.cn[未注册用户]2007-04-26 01:26
    有空要多来跟你学学
     回复 引用