日历
网志分类
展开全部
· ***    All     ***
· ***    Mood    ***
· ***    Life    ***
· *** Technology ***
· ***     Yc     ***
· ***  Cartoon   ***
· *** Collection ***
· ***  Unsorted  ***
媒体播放器

Get the Flash Player to see this player.
SkyDrive is currently not available.

站内搜索
友情链接
· 我的歪酷 非非共享界
· 风雨妖虹
· kingbeful@csdn
· 手心的太阳@瞬间十年
· Moment@Travis
· 江南麒麟居
· εз毛线团εз
· 乌拉的neverland
· 碾过的日子 闲也陶陶
· 狡兔三窟 *^.^*
· 橄榄林的风
· 水色の街
· Powerful and delicate, Life struggling
· 阿德咖吧
· 陷阱
· 风之华
· vkobe的Neverland@@
· 白日梦已死 · 伤越夜海
· 望天
· 空の軌跡
· 没什么好东西的空间
· 心情...咖啡屋
· 随风独自凉
· Some where i belong
· .★·°双晨·故事°☆ .
· BigWorld的记事本
· *Sara's*
· 人生若只如初见
· 宠辱不惊闲看庭前花开花落·去留无意漫随天外云卷云舒
· 我思我不在
· 飞扬飘雨
· lazy的猫猫
常用链接
· [Google]
· [Google Accounts]
· [IT Items]
· [Telnet@Yanxi]
· [Wikipedia]
· [Linux Manpages]
· [Mofile.com]
· [163888.net]
· [fm.qq.com]
· [Proxy]
· [Animepaper.net]
· [FreeproxySite]
· [gonwan@fc2]
· [skydrive.live.com]
· [gonwan@lifelogger]

订阅 RSS

0109799

歪酷博客

逆さまの蝶
In this Craziness
Uncertainy
一人一人の想いを
僕らは何処かに遺せるだろうか

In this Craziness
You gave me life
一つの想いを
僕らは何処まで守れるだろうか



« 上一篇: <<Design Pattern>> 学习笔记(3) 下一篇: douban, amazon 不错 »
丸子·酱 @ 2008-09-17 17:11

    今天是Behavioral patterns, 行为型模式, 第二部分, 至此所有GoF的23种设计模式全部讲完:

1) Memento
    Indent: Without violating encapsulation, capture and externalize an object's internal state so that the object can be restored to this state later.
    备忘录, 保存内部状态. 似乎从来没接触过这个模式. 那就直接按照书上的说法来吧. 首先, OO的做法肯定会把一个状态定义成一个object, 这里就是一个memento, 然后我们用哪个对象来操作它呢? 一种做法是CareTaker(client), 但是这样的话, client必须知道Originator里的内部数据, 与OO封装思想不符. 那就只能由Originator自己来了. 于是就演变成了现在的Memento模式.
    书上的代码, 越来越诡异, 为什么要引入一个大家都不太懂ContaintSolver之类的东西呢. 然后就是所有的memento到底怎么保存的问题. Indent里并没有提及, 书上的代码是放在CareTaker里的, 而且只保存了最近的一个, 我觉得应该保存所有的. 以下是比较易懂的代码: http://sourcemaking.com/design_patterns/memento/java/1

2) Observer
    Indent: Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.
    这个很简单, 知道MVC吧, 知道publish/subscribe吧, 都是同一个东西.
    还记得之前的Command模式么? 我举了一个Java例子. 其中有一个Listener, 一个Action. Listener对于的是Observer模式, 而Action对于的是Command模式. 这样应该清楚了. Observer模式针对的是消息的传递, 而Command则是消息的封装.
    代码: http://sourcemaking.com/design_patterns/observer/c%2523

3) State
    Indent: Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.
    根据意图, 最容易想到的是, 根据一个state, 做一个长长的switch结构. 但是这样做的坏处就是一个函数可能很长. 那你说我把分支都拆成函数. OK, 那如果有多个函数都是需要做switch操作, 也就是说都依赖操作呢? 好了, 既然我们说的是设计模式, 那个solution就是定义抽象类(or接口), 然后只要根据state设一个具体类, 就行了, 这就是State模式的做法.
    代码: http://sourcemaking.com/design_patterns/state/c++/1

4) Strategy
    Indent: Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
    也就是说把行为分离出来了. 还记得跟Decorator模式的区别么? 后者控制skin, 前者控制nuts.
    然后, 还有跟State模式的区别. 看类图, 你会发现其实是一样的, 囧... 又是目的的侧重不同. State模式针对状态的改变, Strategy针对内部算法. 当然你可以说, 因为state改了, 相应的strategy也要改. 不过有一点比较重要: State模式中的各个状态是一个整体, 也就是说它们之间存在一定的先后依赖关系. 而Strtegy则不存在这种关系.
    代码: http://sourcemaking.com/design_patterns/strategy/c%2523

5) Template Method
    Indent: Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.
    话说我从来没听说过这个, 不过肯定是用过的. 比如Java中, 你要自己写一个servlet, 那你要继承一个HttpServlet父类, 然后你记得自己做了什么? 填写doGet(), doPost()之类的方法. 但是当servlet真正执行的时候, 才不管你能下溯到什么类型, 只要调用具体的doGet(), doPost()就行了.
    关键就是, 把父类的行为延迟到了子类. 而父类只定义一套流程, 让具体子类来实现流程中的一些步骤(method). 这就是Template Method模式.
    书上提到一个primitive operation和hook operation, 还有abstract operation, 于是这3者是个什么关系? 我的理解是abstract operation就是primitive operation, 只是针对的角度不同, abstract operation针对实现, primitive operation针对模式, 其实就是一个纯虚函数, 子类必须重定义. hook operation则是提供了缺省实现的, 子类可以重定义.
    这个东西跟Strategy模式的区别: Strategy用的是委托, Template Method用的是继承.
    再提一句, 这个东西跟C++中STL的template无关!!
    代码: http://sourcemaking.com/design_patterns/template_method/c++/1

6) Visitor
    Indent: Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.
    意图是对一个对象的各个元素提供一个横向的操作. 由于各个元素实际上不涉及具体的操作了, 所以要添加一个操作就是添加一个Visitor. 这里的Vistor抽象类有点特别, 它的接口完全是根据元素来定的. 于是当我们要添加一个元素的时候就麻烦了, 我们要在每个Visitor里都加一个对应的访问操作. 所以, Visitor模式适用范围就是那些元素结构相对稳定的对象结构.
    另外, 书上说Visitor模式可以用于Interpreter模式之上. 我觉得Visitor模式弄完了之后, 实际上对外提供了一个简单接口就是一个Facade模式, 嘿嘿.
    代码: http://sourcemaking.com/design_patterns/visitor/c++/1


曾经的这一天...



评论 / 个人网页 / 扔小纸条
* 昵称

已经注册过? 请登录

新用户请先注册 以便能显示头像及追踪评论回复

Email
网址
* 评论
表情
 


 

分类小组论坛
杂谈 , 娱乐、八卦 , 文学、艺术 , 体育 , 旅游、同城 , 象牙塔 , 情感 , 时尚、生活 , 星座 , 科技

请注意遵守中华人民共和国法律法规, 如威胁到本站生存, 将依法向有关部门报告, 同时本站的相关记录可能成为对您不利的证据.

相关法律法规
全国人大常委会关于维护互联网安全的决定
中华人民共和国计算机信息系统安全保护条例
中华人民共和国计算机信息网络国际联网管理暂行规定
计算机信息网络国际联网安全保护管理办法
计算机信息系统国际联网保密管理规定