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

2014-11-24 12:01:40 · 作者: · 浏览: 1
* 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;
}

三. 说明

1. 首先有一点要明确,就是两种种子不会轻易改变,也就是只有普通和太空种子两种。换句话说就是,数据结构比较稳定。

2. 可以变的是新增的状态,比如增加一个X光下的生成情况,等等。说白了就是,操作集合可以相对自由的演化。

3. 这种结构的优点是,增加新的操作很容易;缺点是,增加新的数据结构有点困难,因为你要在每一个访问者里都添加相应的操作。

4. 种子生长图相对于访问者模式的结构图有如下关系:

seed(种子)相当于 element(元素),这个是不怎么变的。


status(状态) 相当于 visitor(访问者),这个是可变且易变的。要注意的是,每个访问者都要对所有的元素(element)进行操作。

5. 事实上我们很少用这种模式,因为数据结构(element)不变的情况很少。

作者 lwbeyond