蜗牛的家
男儿当自强
posts - 48,  comments - 21,  trackbacks - 0
意图:
表示一个作用与某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作
UML图:


适用:
一个对象结构包含很多类对象,他们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作
需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作污染这些对象的类,Vi s i t o r 使得你可以将相关的操作集中起来定义在一个类中。当该对象结构被很多应用共享时,用Vi s i t o r 模式让每个应用仅包含需要用到的操作
定义对象结构的类很少变化,但经常需要在此结构上定义新的操作,改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价,如果对象结构类经常改变,那么可能还有在这些类中定义这些操作较好
//test.h
//////////////////////////////////////////////////////////////////////////
class Visitor;

class Element
{
public:
    
virtual ~Element(){}
    
    
virtual void Accept(Visitor &rVisitor) = 0;
protected:
    Element()
{}
}
;

class ConCreateElementA : public Element
{
public:
    
virtual ~ConCreateElementA(){}
    
    
virtual void Accept(Visitor &rVisitor);
}
;

class ConCreateElementB : public Element
{
public:
    
virtual ~ConCreateElementB(){}

    
virtual void Accept(Visitor &rVisitor);
}
;

class Visitor
{
public:
    
virtual ~Visitor(){}
    
    
virtual void VisitConcreateElementA(ConCreateElementA *pConcreateElementA) = 0;
    
virtual void VisitConcreateElementB(ConCreateElementB *pConcreateElementB) = 0;
protected:
    Visitor()
{}
}
;

class ConcreateVisitorA
    : 
public Visitor
{
public:
    
virtual ~ConcreateVisitorA(){}

    
virtual void VisitConcreateElementA(ConCreateElementA *pConcreateElementA);
    
virtual void VisitConcreateElementB(ConCreateElementB *pConcreateElementB);
}
;

class ConcreateVisitorB
    : 
public Visitor
{
public:
    
virtual ~ConcreateVisitorB(){}

    
virtual void VisitConcreateElementA(ConCreateElementA *pConcreateElementA);
    
virtual void VisitConcreateElementB(ConCreateElementB *pConcreateElementB);
}
;

// test.cpp : Defines the entry point for the console application.
//

#include 
"stdafx.h"
#include 
<iostream>
#include 
"test.h"
//////////////////////////////////////////////////////////////////////////
void ConCreateElementA::Accept(Visitor &rVisitor)
{
    rVisitor.VisitConcreateElementA(
this);
}


void ConCreateElementB::Accept(Visitor &rVisitor)
{
    rVisitor.VisitConcreateElementB(
this);
}


void ConcreateVisitorA::VisitConcreateElementA(ConCreateElementA *pConcreateElementA)
{
    std::cout 
<< "VisitConcreateElementA By ConcreateVisitorA\n";
}


void ConcreateVisitorA::VisitConcreateElementB(ConCreateElementB *pConcreateElementA)
{
    std::cout 
<< "VisitConcreateElementB By ConcreateVisitorA\n";
}


void ConcreateVisitorB::VisitConcreateElementA(ConCreateElementA *pConcreateElementA)
{
    std::cout 
<< "VisitConcreateElementA By ConcreateVisitorB\n";
}


void ConcreateVisitorB::VisitConcreateElementB(ConCreateElementB *pConcreateElementA)
{
    std::cout 
<< "VisitConcreateElementB By ConcreateVisitorB\n";
}

//////////////////////////////////////////////////////////////////////////
int main(int argc, char* argv[])
{
    Visitor 
*pVisitor = new ConcreateVisitorA;
    Element 
*pElement = new ConCreateElementA;
    
    pElement
->Accept(*pVisitor);
    
    delete pElement;
    delete pVisitor;

    system(
"pause");
    
return 0;
}

posted on 2008-08-23 12:18 黑色天使 阅读(579) 评论(0)  编辑 收藏 引用 所属分类: 设计模式

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理



<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

常用链接

留言簿(2)

随笔分类

随笔档案

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜