大胖的部落格

Just a note

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  112 随笔 :: 0 文章 :: 3 评论 :: 0 Trackbacks
Element类提供一个Accept方法,接受visitor。
在不改变element类的前提下,定义对element类的新操作。
每个Visitor定义一个针对目标element类的访问方法,该方法接受一个element类型指针,在该方法中对目标element进行操作。
调用element的accept方法,传入visitor,在accept方法中调用visitor的访问方法,传入element自己的指针。
这样,定义了新的visitor后,只需要调用element的accept传入新的visitor,即可对element进行新操作。

#include <iostream>


using namespace std;

class Visitor;

//原类,提供Accept方法,接受visitor
class Element
{
public:
    
virtual void Accept(Visitor* p) = 0
}
;

class ConcreteElement: public Element
{
public:
    
void Accept(Visitor* p);
    
//测试的操作函数
    void Operation(const char* c) const
    
{
        cout
<<c<<endl;
    }

}
;

//visitor基类,提供针对某个element类的访问接口,该接口传入目标类类型参数
class Visitor
{
public:
    
virtual void VisitConcreteElement(ConcreteElement* p) = 0;
}
;

class ConcreteVisitorA: public Visitor
{
public:
    
//visitor派生类重写访问接口,对目标类进行操作
    void VisitConcreteElement(ConcreteElement* p)
    
{
        p
->Operation("A");
    }

}
;

class ConcreteVisitorB: public Visitor
{
public:
    
//不通的visitor派生类对目标类进行不同的操作
    void VisitConcreteElement(ConcreteElement* p)
    
{
        p
->Operation("B");
    }

}
;

void ConcreteElement::Accept(Visitor* p)
{
    
//接受visitor时把自己传进去,让visitor操作
    p->VisitConcreteElement(this);
}




int main()
{
    
//创建不同的visitor,目的是对目标类进行不同的操作
    Visitor* pa = new ConcreteVisitorA;
    Visitor
* pb = new ConcreteVisitorB;
    Element
* pe = new ConcreteElement;
    
    
//传入不同的visitor,不同的visitor实现不同的操作
    pe->Accept(pa);
    pe
->Accept(pb);

    delete pe;
    delete pb;
    delete pa;
    
return 0;
}
posted on 2009-06-10 16:02 大胖 阅读(184) 评论(0)  编辑 收藏 引用 所属分类: Design Pattern

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