[GoF設計模式]Composite模式和Visitor模式的C++實現

【Composite模式】

 組合模式的關鍵是抽象類,它既可以代表圖元(Leaf),也可以代表圖元的容器(Composite)。組合模式可以用於創建樹狀的結構。用於使用抽象類接口與組合結構中的對象進行交互。如果接收是一個葉結點,則直接處理請求。如果接受者是Composite,它將請求發送給他的子部件,即圖元,在轉發請求之前或者之後可以進行輔助的操作。組合模式可以用於遞歸地創建樹形結構。組合模式的重點在於構造類,而Decorator模式的重點在於不生成子類即可以給類添加職責。

【圖解】一副圖片可以由子圖片以及圖元。如一副圖片由線圖元、矩形圖元、裏頭還嵌了個子圖片,該子圖片由文本圖元、線圖元、矩形圖元構成。

 

 

 

 

【程序】

1

 

 

 

 

 

 

【輸出】

1

 

 

【Visitor模式】

訪問者模式的作用是表示作用於某對象結構中的各元素的操作,使得在不改變各元素類的前提下,定義作用於這些元素的新操作。Visitor模式提供了支持單分派(single-dispatch)語言的雙分派策略。雙分派(double-dispatch or multi-dispatch)是指從兩個方面來說的,一個是接收着的型別(即句柄的型別),一個是函數參數運行時候的型別(用RTTI來實現的)。一般的面向對象的語言如C++/JAVA/C#都只支持單分派。這樣雙分派的實現在C++中可以採用兩種方式,一種是函數的重載(即使參數的類別不同),另外一種則是RTTI來實現(通過typeid判斷,要用到if...else...等),後者的封裝性較差不提倡使用。一般而言使用前者,即函數的重載實現。

【圖解】

以下以中國遊客和美國遊客,去中國或者去美國旅遊爲例子說明

2

 

【程序】

程序既給出了重載的方式實現的雙分派,也給出了以RTTI方式實現的雙分派,注意typeid(*elm)中要傳對象參數,而不是指針類型elm,剛開始還弄錯了。

 

 

 

 

 

 

 

 

【輸出】

2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章