乱砍设计模式之十一

来源:百度文库 编辑:神马文学网 时间:2024/04/29 16:58:40
剩余的模式
junguo
FACADE(外观)模式:是为子系统中的一组接口提供一个一致的界面。该模式理解起来还是比较容易的,举个例子:
class Eye{public:Draw(){}};class Mouse{public:Draw(){}};class Nose{public:Draw(){}};
我们有眼睛,嘴,鼻子这样的类。一般来说脸的组成是一定的,那我们就可以提供一个Face类,如下:
class Face{public:Draw(){Eye LiftEye;Eye RightEye;Mouse mouse;Nose nose;liftEye.Draw();RightEye.Draw();mouse.Draw();nose.Draw();}};
一般情况下,Eye,Mouse和Nose的使用都是这样的一个过程。而Fa?ade的目的就是为一般情况提供一个简化的接口,使用者直接调用Face就可以了,不需要自己去调用Eye等类了。
FLYWEIGHT(享元)模式:应用共享技术有效地支持细粒度的对象。这个模式,我自己想不到太好的例子,简单的把《设计模式》上的例子在这儿再序述一下。假如我们做一个文本编辑器,准备把每个字符做为一个对象,那么我们可能有这样一个类:
class Character{private:CFond _fond;Color _color;char _charcode;public:Draw(){}};
可以看到每个字符都包括字体,颜色等信息。这样的话,每个字符都会占用比较大的空间,而我们知道来般来说一篇文章中有很多重复的字符(尤其是英文,总共就那么26个字母),为每个字符都提供一个对象,是种浪费。这时候就可以利用FLYWEIGHT模式,可以提供一个链表,把出现了的字符组合放到链表中。这样使用字符的时候,只要有它在链表中的位置就可以了(可能是个整数,也可能是一个指针,总之比Character会小很多)。具体如何去用,大家可以参考《设计模式》一书。
PROXY(代理)模式:该模式其实很简单,目的就是帮助远程对象或者占用空间比较大的对象提供一个代理接口,这样只有在真正需要被代理类的时候,才把它载入内存。还是《设计模式》上的例子,简单看一下:
class ImageProxy{private:Image *_image;public:void Draw(){if ( _image == NULL){_image = LoadImage(fileName);}_image.Draw();}};
不多写了,代理类会拥有一个它代理的类的对象,如Draw()中,只有在真正需要_image的时候才把它载入内存。
Chain Of Responsibility(责任链)模式:该模式的目的是使多个对象有机会处理请求,如果一个对象不对请求作出响应,则沿着链表传递请求,直到找到可以处理该请求的对象为止。MFC中的消息处理机制就是如此实现的,有兴趣的可以找来看看。
Interpreter(解释器)模式,其实就是Composite模式,《设计模式》书上有一段描述说Interpreter不是Composite模式,但我没搞明白究竟在说什么(不知道是不是翻译的变了味)。反正它和Composite模式形式上没有太多区别。
Mediator(中介者)模式,感觉不容易简单讲明白,还是自己看书吧。事实上也不难理解。
Memento(备忘录)模式,这个模式没什么好讲的,就是在操作过程中,一个对象的状态可能改变,为了支持返回操作,可能需要把该对象的状态记录下来,这样的话就需要提供一个Memento类了。
Template Method(摸版方法),该模式主要用在框架中,如MFC中。方法的就是在基类中定义一个操作算法的骨架,而将一些函数延迟到子类中才实现。例子还是看书吧,其实实现方法和工厂方法类似。
参考书目:1, 设计模式——可复用面向对象软件的基础(Design Patterns ——Elements of Reusable Object-Oriented Software) Erich Gamma 等著 李英军等译 机械工业出版社2, Head First Design Patterns(影印版)Freeman等著 东南大学出版社3, 道法自然——面向对象实践指南 王咏武 王咏刚著 电子工业出版社