posts - 256, comments - 1319, trackbacks - 41, articles - 8
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

不谈模式,只谈实现

Posted on 2007-02-07 01:01 FantasySoft 阅读(2923) 评论(9)  编辑 收藏 所属分类: All About SoftElegant Python
        回到家已经很晚了,还是很习惯性的上上博客园,看看大家一天精彩的文章,以求擦出些智慧的火花,让不太灵光的脑袋能够变得聪明些。这不,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方法的实现,我们也可以使用类似的方式,在这里就不赘述了。

Feedback

#1楼    回复  引用  查看    

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

从反面来讲,我在 C# 中也非常喜欢用 delegate, 匿名函数这些特性。因为更灵活。
而动态语言如 Python/IronPython 就更爽了,对动态语言来说,如果要实现一些静态 OO 语言里面的模式,感觉都没啥必要原样照搬,因为一般都有简洁的多的方式来实现。
个人觉得动态语言更体现了“约定优于配置”的原则,从而生产力更高。

#2楼    回复  引用  查看    

2007-02-07 09:32 by Justin      
有空要多来跟你学学IronPython~

#3楼    回复  引用    

2007-02-07 09:50 by dd [未注册用户]
有什么好说的呢??

#4楼    回复  引用  查看    

2007-02-07 11:11 by Jeffrey Zhao      
这就是动态语言啊,相当于保留函数指针。
C#里面很向函数指针的是什么的呢?就是delegate。
而delegate的典型应用是什么呢?就是事件机制。
那么Java里的事件机制是怎么做到的呢?就是定义EventListener然后实现相应的方法。这就是和那个OO的Duck类似的实现了,一个Duck和一个EventListener在这个方面有些接近。
如果不熟悉Java的Event Listener的话也可以用传统的Observer模式来看,而且其实Event Listener等等,其实不就是用了Observer模式嘛。

#5楼 [楼主]   回复  引用  查看    

2007-02-07 11:38 by FantasySoft      
@Jeffrey Zhao

没错,这就是动态语言的优势,让实现变得更加直接了当。

#6楼    回复  引用    

2007-02-07 19:55 by huangyi [未注册用户]
其实你这里所展示的并未完全发挥动态语言的灵活性。
动态语言的精髓在于 duck typing 。
恰巧我刚写了篇简单的 duck typing 介绍:http://docs.google.com/View?docid=dczg8vtk_18gxgvgq

#7楼    回复  引用  查看    

2007-02-07 19:56 by charleschen      
语言级别的动态?虽然灵活。
但是估计设计图会让人看的晕死。。。

#8楼    回复  引用    

2007-02-09 16:59 by daya [未注册用户]
Python还挺简单的。。。不过我还没有机会用过呢!

#9楼    回复  引用    

2007-04-26 01:26 by readroom.cn [未注册用户]
有空要多来跟你学学

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-02-07 01:18 编辑过
 
另存  打印