程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 設計模式之訪問者模式,C++實現

設計模式之訪問者模式,C++實現

編輯:C++入門知識

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved