设计模式 Design Parttern ——访问模式Visitor http://blog.csdn.net/leeidea //1:头文件 #ifndef _VISTOR_H_VANEY_ #define _VISTOR_H_VANEY_ #include <iostream> using namespace std; /****************************************************************** 名称 :Vistor.h 版本 :1.00 描述 :演示访问者模式的概念 作者 :vaney.li@gmail.com http://blog.csdn.net/leeidea 日期 :2010年10月28日 版权 :vaney.li@gmail.com http://blog.csdn.net/leeide ******************************************************************/ /* 官方解释:The Visitor pattern represents an operation to be performed on the elements of an object structure, without changing the classes on which is operates. 我的理解:访问者就是一组操作函数,被访问的对象接受不同的访问者的时候会出现不同的结果。 */ //抽象访问者 class CClient; class CVisitor { public: CVisitor() { cout << "CVisitor()" << endl; } virtual ~CVisitor() { cout << "~CVisitor()" << endl; } public: virtual void Change(CClient*) = 0; }; //抽象对象 class CClient { public: CClient():m_score(0),m_visitor(0) { cout << "CClient()" << endl; } virtual ~CClient() { cout << "~CClient()" << endl; } public: //需要子类实现的方法 virtual int GetScore() { return m_score; } virtual void SetScore(int score) { m_score = score; } virtual void SetVistor(CVisitor* v) { m_visitor = v; } virtual void Do() { if(m_visitor) m_visitor->Change(this); } protected: int m_score; CVisitor* m_visitor; }; //访问者Add将增加分数 class CAdd : public CVisitor { public: CAdd() { cout << "CAdd()" << endl; } virtual ~CAdd() { cout << "~CAdd()" << endl; } public: virtual void Change(CClient* s) { if(s) { cout << "add score" << endl; int score = s->GetScore(); s->SetScore(++score); } } }; //访问者Add将减小分数 class CSub : public CVisitor { public: CSub() { cout << "CSub()" << endl; } virtual ~CSub() { cout << "~CSub()" << endl; } public: virtual void Change(CClient* s) { if(s) { cout << "sub score" << endl; int score = s->GetScore(); s->SetScore(--score); } } }; #define C_API extern "C" //用户 C_API int UsingVS(); #endif //2:源文件 #include "Visitor.h" C_API int UsingVS() { CAdd* Visitor_add = new CAdd(); CSub* Visitor_sub = new CSub(); CClient* client = new CClient(); //Visitor_add 将增加client的分数 client->SetVistor(Visitor_add); client->Do(); //Visitor_sub 将减少client的分数 client->SetVistor(Visitor_sub); client->Do(); return 1; } //3:用户文件main.c extern int UsingVS(); //系统默认入口 int _tmain(int argc, _TCHAR* argv[]) { return UsingVS(); }