剩余的模式
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, 道法自然——面向對象實踐指南 王詠武 王詠剛著 電子工業出版社