设计模式C++描述----22.访问者(Visitor)模式 (一)

2014-11-24 12:01:40 · 作者: · 浏览: 0

一. 访问者模式

定义:表示一个作用于某对象结构中的各元素的操作。它你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

结构如下:

\


二. 举例

假设有一项科学实验,是用来对比两种种子在不同环境下的生长情况。

两种种子,一种是普通的种子(Seed_A),一种是太空运回的种子(Seed_B)。

生长环境,分别是在多雨环境下(Rain_Status),阳光环境下(Sun_Status)等等。

结构如下:

\


代码如下:


[cpp] //状态
class Status
{
public:
virtual ~Status() {}

virtual void VisitSeed_A(Seed* elm) {}

virtual void VisitSeed_B(Seed* elm) {}

protected:
Status() {}
};

//下雨状态
class Rain_Status:public Status
{
public:
Rain_Status() {}

virtual ~Rain_Status() {}

//下雨状态下A种子生长的情况
virtual void VisitSeed_A(Seed* elm)
{
cout<<"Rain will visit Seed A..."< }

//下雨状态下B种子生长的情况
virtual void VisitSeed_B(Seed* elm)
{
cout<<"Rain will visit Seed B..."< }
};

//阳光状态
class Sun_Status:public Status
{
public:
Sun_Status() {}

virtual ~Sun_Status() {}

//阳光状态下A种子生长的情况
virtual void VisitSeed_A(Seed* elm)
{
cout<<"Sun will visit Seed A..."< }

//阳光状态下B种子生长的情况
virtual void VisitSeed_B(Seed* elm)
{
cout<<"Sun will visit Seed B..."< }
};



//种子
class Seed
{
public:
virtual ~Seed() {}
virtual void Accept(Status* vis) = 0;

protected:
Seed() {}
};

//种子A,假设为普通种子
class Seed_A:public Seed
{
public:
Seed_A() {}

~Seed_A() {}

void Accept(Status* vis)
{
vis->VisitSeed_A(this);
}
};

//种子B,假设为从太空带回来的种子
class Seed_B:public Seed
{
public:
Seed_B() {}
~Seed_B() {}

void Accept(Status* vis)
{
vis->VisitSeed_B(this);
}
};


//对象结构类,为了对比不同种子
class ObjectStructure
{
private:
list lseed;

public:
//Add
void Attach(Seed* seed)
{
lseed.push_back(seed);
}

//Delete
void Detach(Seed* seed)
{
lseed.remove(seed);
}

//Show
void Display(Status* status)
{
list::iterator it = lseed.begin();

for (it; it != lseed.end(); ++it)
{
(*it)->Accept(status);
}
}
};


//测试代码
int main(int argc,char* argv[])
{
ObjectStructure obj;

//加入要对比的两个种子
obj.Attach(new Seed_A());
obj.Attach(new Seed_B());

//查看各种状态下两个种子的情况
obj.Display(new Rain_Status());

//Sun Satte
obj.Display(new Sun_Status());

return 0;
}
//状态
class Status
{
public:
virtual ~Status() {}

virtual void VisitSeed_A(Seed* elm) {}

virtual void VisitSeed_B(Seed* elm) {}

protected:
Status() {}
};

//下雨状态
class Rain_Status:public Status
{
public:
Rain_Status() {}

virtual ~Rain_Status() {}

//下雨状态下A种子生长的情况
virtual void VisitSeed_A(Seed* elm)
{
cout<<"Rain will visit Seed A..."< }

//下雨状态下B种子生长的情况
virtual void VisitSeed_B(Seed* elm)
{
cout<<"Rain will visit Seed B..."< }
};

//阳光状态
class Sun_Status:public Status
{
public:
Sun_Status() {}

virtual ~Sun_Status() {}

//阳光状态下A种子生长的情况
virtual void VisitSeed_A(Seed* elm)
{
cout<<"Sun will visit Seed A..."< }

//阳光状态下B种子生长的情况
virtual void VisitSeed_B(Seed* elm)
{
cout<<"Sun will visit Seed B..."< }
};

//种子
class Seed
{
public:
virtual ~Seed() {}
virtual void Accept(Status* vis) = 0;

protected:
Seed() {}
};

//种子A,假设为普通种子
class Seed_A:public Seed
{
public:
Seed_A() {}

~Seed_A() {}

void Accept(Status* vis)
{
vis->VisitSeed_A(this);
}
};

//种子B,假设为从太空带回来的种子
class Seed_B:public Seed
{
public:
Seed_B() {}
~Seed_B() {}

void Accept(Status