設計模式不能濫用啊 先借一張圖 [cpp] // Visitor.cpp : 定義控制台應用程序的入口點。 // #include "stdafx.h" // 訪問者模式(vistor), 表示一個作用於某對象結構中的各元素的操作, // 它使你可以在不改變各元素類的前提下定義作用於這些元素的操作 // 假設一個繪制軟件,只能夠繪制線面兩種類型的圖形 // 但是每個圖形都有多種風格(有紋理,無紋理,三維模式,等等等等) // 繪制方式 // 繪制方式,(風格)可以無限添加,從DrawAction中派生即可 // 每個派生類中都會重載對【線】和【面】的繪制 // 其特點是,繪制風格通過指針傳遞給繪制對象類,繪制對象類會根據自己的指針 // 調用繪制風格的兩個繪制對象函數的一種,然後由繪制風格派生類來實現繪制方式 class DrawAction { public: virtual void DrawLine() = 0; virtual void DrawPolygon() = 0; }; class DrawWithTexture : public DrawAction { public: void DrawLine() {printf("繪制無紋理的線\n");} void DrawPolygon() {printf("繪制無紋理的多邊形\n");} }; class DrawWithOutTexture : public DrawAction { public: void DrawLine() {printf("繪制有紋理的線\n");} void DrawPolygon() {printf("繪制有紋理的多邊形\n");} }; class DrawIn3DModel : public DrawAction { public: void DrawLine() {printf("繪制3D模式下的線\n");} void DrawPolygon() {printf("繪制3D模式下的多邊形\n");} }; class Element { public: virtual void Draw(DrawAction *visitor) = 0; }; class Line : public Element { public: void Draw(DrawAction *visitor) { visitor->DrawLine(); } }; class Polygon : public Element { public: void Draw(DrawAction *visitor) { visitor->DrawPolygon(); } }; // 一般的做法是,將繪制對象封裝,抽象類Element中只有一個Draw純虛函數,以及一個SetDrawStyle(...) // 函數,通過SetStyle將風格設置進來,然後在派生類的Draw函數中用switch case繪制 // (ps.我們現在的系統就是這樣寫的,還好吧,比較直觀,還能保存繪制風格呢) // 但是vistor這是一種雙選擇模式 // 繪制的時候需要知道繪制對象的種類,和繪制風格的種類 // 傳給繪制對象的不是狀態的枚舉,而是一個類指針 // 因為傳遞的是類指針,所以可進行動態綁定,通過風格類指針來調用繪制函數 int _tmain(int argc, _TCHAR* argv[]) { Element *pLine = new Line; Element *pPoly = new Polygon; DrawAction *pHTex = new DrawWithTexture; DrawAction *p3DM = new DrawIn3DModel; // 析構部分 略 pLine->Draw(pHTex); pPoly->Draw(p3DM); return 0; } 輸出結果 繪制無紋理的線 繪制3D模式下的多邊形 請按任意鍵繼續. . .