設計模式不能濫用啊
先借一張圖
[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模式下的多邊形
請按任意鍵繼續. . .