《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(五)
《大话设计模式》将于11月底由清华大学出版社出版
《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(一)
《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(二)
《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(三)
《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(四)
(接上一篇)
29.7 行为型模式二组比赛
“欢迎回到第一届OOTV杯超级设计模式大赛现场,下面是行为型模式二组,也就是最后一组的比赛,她们将穿C++旗袍出场。”
“首先出场的是18号选手,解释器小姐,它声称给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。[DP]”
18号选手 解释器(interpreter)
“19号选手是中介者小姐,她说她是用一个中介对象来封装一系列的对象交互。中介者使各对像不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。[DP]”
19号选手 中介者(Mediator)
“20号小姐向我们走来,访问者小姐,她表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。[DP]”
20号选手 访问者(Visitor)
“21号小姐是策略,一个可爱的姑娘,她的意图是定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。[DP]”
21号选手 策略(Strategy)
“22号选手,备忘录小姐,她说在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。[DP]”
22号选手 备忘录(Memento)
“最后一名选手,23号,迭代器小姐,她说,提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。[DP]”
23号选手 迭代器(Iterator)
Hibernate:“这组里我只认识策略小姐,看过她做过不少广告,迭代器好像也听说过。其他的MM太没名气了,我不看好她们。”
ADO.NET:“中介者也还算行吧,至少我是知道她的。不过这一组实力是不太强,估计策略拿第一没什么悬念了。”《大话设计模式》
“好的,各位小姐已展示完毕,下面有请评委提问。”主持人GOF说。
“请问解释器小姐,说说你参赛的动机和优势?”依赖倒转问道。
解释器小姐很镇定地答道:“在编程世界里,实现目标都是通过编写语言并执行来实现的,从最低级的机器语言到人能很容易读懂机器也可以执行的高级语言,但是高级语言编写起一些问题可能还是比较复杂。如果一种特定类型的问题发生的频率足够高,那么就可以考虑将该问题的各个实例表述为一个简单语言中的句子。也就是说,通过构建一个解释器,该解释器解释这些句子来解决该问题[DP]。比 如正则表达式就是描述字符串模式的一种标准语言,与其为每一个字符串模式都构造一个特定的算法,不如使用一种通用的搜索算法来解释执行一个正则表达式,该正则表达式定义了待匹配字符器的集 合[DP]。”
“中介者小姐,人家都说你是交际花,请问你广交朋友的目的是什么?”迪米特问道。
“交际花不敢当,但我的确喜欢交朋友。面向对象设计鼓励将行为分布到各个对象中,这种分布可能会导致对象间有许多连接。也就是说,有可能每一个对象都需要知道其他许多对象。对象间的大量相互连接使得一个对象似乎不太可能在没有其他对象的支持下工作,这对于应对变化是不利的,任何较大的改动都很困难[DP]。所以说朋友多既是好事情,其实也是坏事情。我提倡将集体行为封装一个单独的中介者对象来避免这个问题,中介者负责控制和协调一组对象间的交互。中介者充当一个中介以使组中的对象不再相互显式引用。这些对象仅知道中介者,从而减少了相互连接的数目[DP]。我作为中介者,广交朋友,就起到了在朋友间牵线搭桥的作用。可以为各位朋友们服务。这其实不也正是迪米特先生您一直倡导的最少知识原则,也就是如何减少耦合的问题,类之间的耦合越弱,越有利于复用[J&DP]。”
现在轮到访问者了,她面无表情,不知是否很紧张。合成聚合复用问道:“访问者小姐,听说你对朋友要求很苛刻,要请到你帮忙是很难的事情,你喜欢交朋友吗?”
听到这个问题,访问者笑开了颜:“哪有这种事情,朋友要我帮忙,我都会尽力而为的。的确,我不太喜欢交很多朋友,一般找到好朋友了,就不喜欢再交往新的朋友了。我的理念是朋友在精不在多。但是我和朋友间的交往通常会是多方面的,一同聊天、逛街、旅游、唱歌、游泳,哪怕是我们不会的活动,我们也可以尝试一起去学习、去扩展我们的生活情趣。也就是说,访问者增加具体的Element是困难的,但增加依赖于复杂对象结构的构件的操作就变得容易。仅需增加一个新的访问者即可在一个对象结构上定义一个新的操作。”
“非常有意思的交友观。下面请策略小姐准备接受提问。”GOF说道。
“请问策略小姐,说说你对‘优先使用对象组合,而非类继承’的理解?”合成聚合复用问道。
策略小姐答得很流利,“继承提供了一种支持多种算法或行为的方法,我们可以直接生成一个类A的子类B、C、D,从而给它以不同的行为。但这样会将行为硬行编制到父类A当中,而将算法的实现与类A的实现混合起来,从而使得类A难以理解、难以维护和难以扩展,而且还不能动态地改变算法。仔细分析会发现,它们之间的唯一差别是它们所使用的算法或行为,将算法封装在独立的策略Strategy类中使得你可以独立于其类A改变它,使它易于切换、易于理解、易于扩展[DP]。这里显然使用对象组合要优于类继承。”
“策略小姐说得非常好,下面想请问一下备忘录小姐,在保存对象的内部状态时,为何需要考虑不破坏封装细节的前提?”单一职责问道。
“通常原对象A都有很多状态属性,保存对象的内部状态,其实也就是将这些状态属性的值可以记录到A对象外部的另一个对象B,但是,如果记录的过程是对外透明的,那就意味着保存过程耦合了对象状态细节。使用备忘录就不会出现这个问题,它可以避免暴露一些只应由对象A管理却又必须存储在对象A之外的信息。备忘录模式把可能很复杂的对象A的内部信息对其他对象屏蔽起来,从而保持了封装边界[DP]。”
“最后一位,迭代器小姐,说说迭代器模式对遍历对象的意义?”里氏代换问道。
“一个集合对象,它当中具体是些什么对象元素我并不知道,但不管如何,应该提供一种方法来让别人可以访问它的元素,而且可能要以不同的方式遍历这个集合。迭代器模式的关键思想是将对列表的访问和遍历从列表对象中分离出来并放入一个迭代器对象中,迭代器类定义了一个访问该列表元素的接口。迭代器对象负责跟踪当前的元素,并且知道哪些元素已经遍历过了[DP]。”《大话设计模式》
“下面有请六位评委评选出行为型二组比赛的第一名。”GOF说道。
“迭代器小姐2票、策略小姐4票。”GOF宣布。“晋级的是策略小姐。”
“Yeah!”策略小姐右手伸出食指和中指,打了“V”型手势,向台前晃了晃,然后收到头顶上方握紧拳头做下拉状。
“哈,策略小姐高兴起来真像个孩子,说说感受吧。”GOF对策略的反应也很开心,微笑着说。
“我要感谢OOTV,感谢六位评委,感谢咱爸咱妈,感谢所有支持我的朋友,我爱你们!”策略仿佛已经问鼎冠军一样说了一大堆感谢的话。
“各位观众,请加快给你喜爱的选手投票,广告过后,我们将关闭短信通道。宣布投票结果。”GOF宣布说。
听主持人一宣布,下面的Fans们又纷纷掏出手机开始最后一轮的疯狂短信。
Hibernate :“看来我们英雄所见完全相同。”
ADO.NET:“是呀,策略早就成名了,所以很习惯于这种大场合说些场面话,明星也是练出来的。”
Hibernate :“现在工厂方法、外观、观察者、策略晋级了,除了这几位,你猜短信的结果是谁?”
ADO.NET:“从感觉上来讲,组合、命令、适配器、迭代器都有机会。”
Hibernate :“就不会出黑马?比如抽象工厂、代理、模板方法、桥接等?不过这次确实难料了。”《大话设计模式》
(未完待续)
声明一下,本29章,可以代表本书的幽默风格,却不能代表本书的讲解技术的方式。正因为这一章的最与众不同,我本想让朋友们可以从全新的视角去看待23个设计模式,回顾一下它们的相同与不同。可惜是剑就有双刃,我忽略了有很多朋友是不了解《小菜编程成长记》的,以为本书全是这种娱乐化的书写,因此得出这样的文字不能得到收获结论。事实并非如此,否则出版社也不会出版本书,而只会让它上IT娱乐杂志了。在将此章结束后,我会帖出讲解设计模式的样章,希望您继续关注。
《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(五)相关推荐
- 《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(四)
<大话设计模式>将于11月底由清华大学出版社出版 <大话设计模式>第29章-OOTV杯超级模式大赛-模式总结(一) <大话设计模式>第29章-OOTV杯超级模式大赛 ...
- 《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(一)
本文出自<大话设计模式>第29章,转载请注明出处.对小菜和大鸟不熟悉的朋友可先去阅读小菜编程成长记系列.本书中出现的"[]"是表示句子摘自某书,比如[DP]表示此句摘自 ...
- 《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(三)
<大话设计模式>将于11月底由清华大学出版社出版 <大话设计模式>第29章-OOTV杯超级模式大赛-模式总结(一) <大话设计模式>第29章-OOTV杯超级模式大赛 ...
- 第二十九章 OOTV杯超级模式大赛-模式总结(读书笔记)
第29章OOTV杯超级模式大赛-模式总结 29.1 演讲任务 小菜睡眼朦胧,趴到了桌上,打起盹来,不一会儿就进入了梦乡. 29.2 报名参赛 工厂模式三姐妹:工厂方法,抽象工厂方法,简单工厂方法. ...
- 「大话设计模式 - 解读」1 策略、修饰、代理模式
策略模式 在日常中,我们常随着时间的不同对同一件事的处理会发生不同.就好像一件物品,在购物平台上的销售策略会发生变化,时而打折,时而满xx元返xx元.这些都是不同的策略,然后策略是无法穷尽的,他们都有 ...
- Android大话设计模式 第四章----里氏代换原则----法海捉拿白蛇新解
应用场景举例: <白蛇传>是中国四大民间传说之一,妇孺皆知. 在大多数人的感觉和印象中,白蛇是一个善良痴情.知恩图报.温柔友善.美貌绝伦.冰雪聪明.明辨是非.救苦救难的活菩萨:而法海却是一 ...
- 大话设计模式 第十一章 迪米特法则 小黑小白在开车
迪米特法则 这名字够叼啊 就不怕其它原则有意见 迪米特法则又叫最少知道原则 应该是被打怕了 一个对象对其它对象应该尽可能少的了解 想不让谁多了解就少给它暴露点呗 这样不想让它了解的它想了解都了解不了啊 ...
- 大话设计模式 第二十三章 命令模式 考羊肉串
命令模式 使请求的调用者和实现者解耦 请求通过命令来传递 命令被封装成对象 烤肉之摊贩 摊贩 烤羊肉串 烤羊肉串 烤鸡翅 public class BarbecuerTest {public void ...
- Android大话设计模式 第三章----开放封闭原则---孙悟空任弼马温一职
应用场景举例 孙悟空从东海龙宫拿到定海神针如意金箍棒后回到花果山,和自己的部下过着自由自在的生活.那只好景不长,因为他在地狱删除了自己和花果山所有猴子的名单,同时又拿走了定海神针,不久便被阎王和龙王告 ...
最新文章
- 刘锋:互联网左右大脑结构与钱学森开放复杂巨系统
- SQL2000常见安装中问题解决方案
- Java学习笔记22
- MongoDB 树形模型
- 阿里云服务网格 ASM 发布新功能:提供更精细化的服务治理能力
- Using Artica Squid Open Source Project to Build Powerful and Safe but Simple to Use Proxy
- 【推荐】BREW中 - 显示和图像
- 评论:北京“网店新规”将死在问题中
- Vue:带参数函数在传递参数的同时传递事件对象
- python实现Longest Common Subsequence最长公共子序列算法
- Ajax控件和类库简析
- LINUX环境变量environ
- 雨课堂计算机基础与应用大一,雨课堂试卷批量导入Word模板.doc
- 《Linux 命令行大全》.pdf
- 执行maven打包命令mvn package前maven会默认执行test命令的解决方法
- npm 安装yarn
- 爬虫:Instagram信息爬取
- 09.mtk背光流程
- 但行好事,莫问前程。
- 要善于借势破局——宁向东的清华管理学课第4课
热门文章
- Spring5+CXF整合开发REST之一次坑旅
- 项目管理需要使用到的图表
- nagios监控mysql服务_nagios监控mysql服务
- php可以控制视频的尺寸吗吗,控制视频像素尺寸这样做
- php xml 接口调用,php的SimpleXML方法读写XML接口文件实例解析
- OAuth2.0 授权码认证方式使用流程
- 获得输入框的文本document.getElementById('id').value;
- cmd xcopy 拷贝文件夹_u盘文件夹被病毒隐藏怎么解决 u盘文件夹被病毒隐藏解决方法【详细步骤】...
- MySQL优化SQL性能问题
- SpringMVC(入门案例)