日历
网志分类
展开全部
· ***    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

0109819

歪酷博客

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

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



« 上一篇: 马太效应 下一篇: <<Design Pattern>> 学习笔记(3) »
丸子·酱 @ 2008-09-15 23:27

    今天来讲讲Structual patterns, 结构型模式:

1) Adapter
    Indent: Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.
    转换一个类的接口. 我们最容易想到的方法就是把现有类包装一下, 对外提供兼容接口. Adapter模式就是这么干的, 这是一个object adapter. 而另一个被称为class adapter的东西用的则是类的继承.
    代码看这里: http://en.wikipedia.org/wiki/Adapter_pattern. 注意其中什么时候用extends, 什么时候用implements.

2) Bridge
    Indent:  Decouple an abstraction from its implementation so that the two can vary independently.
    把抽象和实现相分离, 这是什么东西, 好像很废话啊. 所谓的bridge, 实际上是在抽象类和具体类中间再加一层关系.
    书上的说法很有朦胧美的感觉, 反正我没完全看懂. 不过这里有两个图很直观: http://sourcemaking.com/design_patterns/bridge. 还附带了代码: http://sourcemaking.com/design_patterns/bridge/c%2523
    也就是说Implementor接口仅提供基本操作(比如操作系统相关), 而Abstraction则定义了基于这些基本操作的较高层次的操作.

3) Composite
    Indent: Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.
    这个应该好理解的, 我就不多说了. 想象一下写java的时候, JPanel是一个JComponent, 可以装到一个JContainer(一个composite)里, 而它本身也可以装其它的JComponent.
    代码可以参考: http://en.wikipedia.org/wiki/Composite_pattern

4) Decorator
    Indent: Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.
    如果你用Java, 那么一定写过这样的代码, 事实上用的就是Decorator模式:
    BufferedInputStream bis = new BufferedInputStream(new DataInputStream(new FileInputStream("foo.txt")));
    Decorator模式的好处是, 它给某个对象, 而不是类添加功能, 即时使用, 避免在层次结构高层的类有太多的特征. 这些都是相对于使用继承的好处.
    还记得Strategy模式么? 我又觉得这个东西跟Decorator模式很像了. 书上说, 前者用来控制对象的guts, 而后者控制对象的skin. Strategy从内部改变对象, 不需要继承之类的东西, 需要的只是对象的对外接口. Decorator从外部改变对象, 因此对象对于这些decorator无需任何了解.
    代码: http://sourcemaking.com/design_patterns/decorator/c++/2

5) Facade
    Indent: Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.
    没什么好说的, 就是一个复杂系统对外提供一个简单接口. 比如一个http server, 只要提供start(), stop()以及一些配置相关的操作就可以了, 用户并不需要知道具体一个http request是怎么被处理的.
    代码: http://en.wikipedia.org/wiki/Design_Pattern_-_Facade

6) Flyweight
    Indent: Use sharing to support large numbers of fine-grained objects efficiently.
    关键字: 共享. 我觉得这个模式有点诡异的. 每个flyweight对象被要求分为extrinsic和intrinsic两部分. 而intrinsic即内部的数据便是我们要共享的数据. 无论是书上还是wikipedia上的代码, 事实上都实现了一个类似object pool的factory类用来做cache和share. 这些东西又很自然的让我想到了http server中thread pool的概念. 那些thread可以重用, thread具体要做的工作实际上是用外部数据的方式传递给它的.
    书上的代码和图例我一点也没看懂, 还是看wikipedia的: http://en.wikipedia.org/wiki/Flyweight_pattern

7) Proxy
    Indent: Provide a surrogate or placeholder for another object to control access to it.
    额..控制对象访问, 也就是在一个类外面在套一层. 为什么那么麻烦呢? 为了控制对象访问..囧... 有4种类型的proxy分别是: remote proxy, virtual proxy, protection proxy, smart reference. 不过, 有的时候不用proxy也能解决问题. 比如一个protection proxy, 我为什么一定要再加一个proxy类判断而不自己判断呢? 的确, 不过我觉得这就是一种功能和逻辑相分离的做法.
    难道所有的类, 我们都要再加一个proxy类? 累死人的. 可以看一下4中分类需要实现的附加功能是否有必要先. 另外, 我觉得可以和Facade模式之间取舍. 一个针对一个class, 另一个针对一个subsystem.
    代码: http://en.wikipedia.org/wiki/Proxy_pattern

8) 总结:
    以上7种都是结构型模式, 描述的是对象的组件. 其实不外乎是两种方法, 一种是继承(inheritance), 一种是组合(composite). 对于继承来说, 一直觉得有很多弊端, 用用多态就可以了, 用来扩展或是其它功能, 要做好真的是有很大难度的, 且还不一定能做好. 又或者就直接定接口(interface), 尽量不要用实现了的类. bridge, composite, decorator模式利用了interface的特点. 而组合则能很好的控制对外接口, adaptor, facade, proxy模式实际上都用到了这一点.
    书后有各个模式的一些比较, 可以参考. 其实, 只要弄明白每个模式要解决的问题是什么就容易区分了, 这也是为什么我要用粗体字表明的原因.


曾经的这一天...



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

已经注册过? 请登录

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

Email
网址
* 评论
表情
 


 

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

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

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