Spiga
Posts - 265, Articles - 8, Comments - 1537
Cnblogs
Dashboard
Login
Home
Contact
Gallery
RSS
Fantasy Soft
不谈模式,只谈实现
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方法的实现,我们也可以使用类似的方式,在这里就不赘述了。
绿色通道:
好文要顶
关注我
收藏该文
与我联系
Categories:
Elegant Python
,
All About Soft
Add your comment
9 条回复
727724
#1楼
木野狐
2007-02-07 02:39
你这个例子是直接把代表不同行为的函数指针保存在类成员中,然后来调用之,感觉上倒和 C# 的 delegate 有类似之处。按照策略模式的本意是需要设计策略的基类(接口),再定义具体策略类。然后客户对象中可以动态加载不同的具体策略类来实现策略的切换。如果从 OO 设计的角度讲,是不鼓励用 delegate 的,因为一般来说 delegate 比较具有侵入性。
从反面来讲,我在 C# 中也非常喜欢用 delegate, 匿名函数这些特性。因为更灵活。
而动态语言如 Python/IronPython 就更爽了,对动态语言来说,如果要实现一些静态 OO 语言里面的模式,感觉都没啥必要原样照搬,因为一般都有简洁的多的方式来实现。
个人觉得动态语言更体现了“约定优于配置”的原则,从而生产力更高。
回复
引用
查看
#2楼
Justin
2007-02-07 09:32
有空要多来跟你学学IronPython~
回复
引用
查看
#3楼
dd [未注册用户]
2007-02-07 09:50
有什么好说的呢??
回复
引用
#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楼
[
楼主
]
FantasySoft
2007-02-07 11:38
@Jeffrey Zhao
没错,这就是动态语言的优势,让实现变得更加直接了当。
回复
引用
查看
#6楼
huangyi[未注册用户]
2007-02-07 19:55
其实你这里所展示的并未完全发挥动态语言的灵活性。
动态语言的精髓在于 duck typing 。
恰巧我刚写了篇简单的 duck typing 介绍:
http://docs.google.com/View?docid=dczg8vtk_18gxgvgq
回复
引用
#7楼
charleschen
2007-02-07 19:56
语言级别的动态?虽然灵活。
但是估计设计图会让人看的晕死。。。
回复
引用
查看
#8楼
daya[未注册用户]
2007-02-09 16:59
Python还挺简单的。。。不过我还没有机会用过呢!
回复
引用
#9楼
readroom.cn[未注册用户]
2007-04-26 01:26
有空要多来跟你学学
回复
引用
注册用户登录后才能发表评论,请
登录
或
注册
,
返回博客园首页
。
首页
博问
闪存
新闻
园子
招聘
知识库
最新IT新闻
:
·
iPhone 5四大猜想:泪珠状 带LED苹果标识
·
当当网Q4整体亏损1.3亿元 上年同期净利润1480万元
·
把孩子培养成为合格Geek的七个方法
·
担心网购的衣服不合身? 创业公司Clothes Horse用“问答”就能解决你的难题
·
评价社交媒体活动ROI的三个精确指标
»
更多新闻...
最新知识库文章
:
·
编程的艺术:漂亮的代码和漂亮的软件
·
GIT分支管理是一门艺术
·
编程:是一门艺术
·
编程是一门艺术吗?
·
对Java初学者的忠告
»
更多知识库文章...
China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务
About
昵称:
FantasySoft
园龄:
7年9个月
荣誉:
推荐博客
粉丝:
38
关注:
11
最新评论
Re:ASP.NET的错误处理机制
asp.net 开发的网站导航 在线采集影视 彩票资讯
-- liuxichao
Re:三言两语话动态代理
看了网上的一篇文章,感觉楼主的理解可能有点问题,DynaProxy应该是实现Recourse接口,而不是组合,源码中有这么一句ProxyGenerator.generateProxyClass(pro... -- 带着爱远行
Re:浅谈HTTP的无状态性
Good。 -- _龙猫
Re:Demand Media——深谙中庸之道的新媒体
导向作为核心竞争力, -- lcy_20000
Re:从银行ATM机取款失败说起
2011年1月10日17:25,公司门口中国银行取款机,我先查询余额,取款机反应很慢,两分钟后信息出来;再输入取款额2600元,取款机开始罢工了,两分钟后显示:网络故障,是否需要打印凭证?还没等选择,... -- 北郭先生
日历
<
2007年2月
>
日
一
二
三
四
五
六
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1
2
3
4
5
6
7
8
9
10
随笔分类
Rss
All About Fantasy(72)
Rss
All About Soft(192)
Rss
Bright Wiki(3)
Rss
Charming Android(1)
Rss
Daily Portal(3)
Rss
Elegant Python(13)
Rss
Excellent WebWork(13)
Rss
Exciting Linux(2)
Rss
Lovely DotNet(14)
Rss
Miscellaneous(27)
Rss
Non Tech.(5)
Rss
Only Windows (12)
Rss
Practical Java(9)
Rss
Pure C++(9)
Rss
Sharp IronPython(34)
Rss
Thought Ware(59)
随笔档案
2010年11月(1)
2010年9月(1)
2010年8月(5)
2010年7月(1)
2010年6月(1)
2010年5月(4)
2010年4月(4)
2010年3月(1)
2010年1月(1)
2009年12月(1)
2009年11月(2)
2009年10月(2)
更多...
2009年4月(1)
2009年3月(2)
2009年2月(1)
2008年11月(1)
2008年10月(1)
2008年7月(2)
2008年6月(1)
2008年4月(1)
2008年3月(1)
2008年1月(1)
2007年12月(1)
2007年7月(1)
2007年6月(3)
2007年5月(1)
2007年4月(5)
2007年3月(3)
2007年2月(2)
2007年1月(2)
2006年12月(2)
2006年11月(3)
2006年10月(2)
2006年9月(6)
2006年8月(5)
2006年7月(10)
2006年6月(6)
2006年5月(6)
2006年4月(2)
2006年3月(3)
2006年2月(2)
2006年1月(5)
2005年12月(5)
2005年11月(6)
2005年10月(5)
2005年9月(11)
2005年8月(15)
2005年7月(14)
2005年6月(6)
2005年5月(2)
2005年4月(4)
2005年3月(2)
2005年2月(2)
2005年1月(3)
2004年12月(3)
2004年11月(1)
2004年10月(9)
2004年9月(28)
2004年8月(29)
2004年7月(5)
2004年6月(7)
2004年5月(2)
推荐排行榜
阅读排行榜
Experts' Links
Allen Lee's Magic
ASP.NET入门随想 - 老燕
femto的Blog
Flier's Sky
HaoHappy' Blog
HD 的 Weblog
Liki's Blog
Raimundo's Blog
Sumtec's Blog
Teddy's Knowledge Base
Terrylee的技术专栏
this.Think()
Venus神庙
爱上写程序
编程夜未眠
透明思考
周星星 之 Blog
装配中的脑袋
琢思磋文轩
My Friends
Underneath the Banyantree
潺潺琴柔,啸啸剑狂
记忆碎片
小鱼曼曼-eely
Wonderful Links
0.中国通
1.Fantasy Soft - 另外的一个窝
A.中华维客
B.维库
C.eemap.org
D.天下维客
E.网络天书