C++设计模式实现--访问者(Visitor)模式
来源:互联网 发布:致得软件 编辑:程序博客网 时间:2024/05/17 23:01
一. 访问者模式
定义:表示一个作用于某对象结构中的各元素的操作。它你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
结构如下:
二. 举例
假设有一项科学实验,是用来对比两种种子在不同环境下的生长情况。
两种种子,一种是普通的种子(Seed_A),一种是太空运回的种子(Seed_B)。
生长环境,分别是在多雨环境下(Rain_Status),阳光环境下(Sun_Status)等等。
结构如下:
代码如下:
- //状态
- 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..."<<endl;
- }
- //下雨状态下B种子生长的情况
- virtual void VisitSeed_B(Seed* elm)
- {
- cout<<"Rain will visit Seed B..."<<endl;
- }
- };
- //阳光状态
- class Sun_Status:public Status
- {
- public:
- Sun_Status() {}
- virtual ~Sun_Status() {}
- //阳光状态下A种子生长的情况
- virtual void VisitSeed_A(Seed* elm)
- {
- cout<<"Sun will visit Seed A..."<<endl;
- }
- //阳光状态下B种子生长的情况
- virtual void VisitSeed_B(Seed* elm)
- {
- cout<<"Sun will visit Seed B..."<<endl;
- }
- };
- //种子
- 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<Seed*> 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<Seed*>::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)不变的情况很少。
0 0
- C++设计模式实现--访问者(Visitor)模式
- Visitor(访问者)设计模式
- 设计模式--访问者模式(Visitor)
- [设计模式]visitor访问者模式
- 设计模式之Visitor(访问者)
- 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)
- 大话设计模式--访问者模式 Visitor -- C++实现实例
- 设计模式(17) 访问者模式(VISITOR) C++实现
- 设计模式实现(二十四)---访问者模式(Visitor)
- Java 实现访问者(Visitor)模式
- 设计模式(21)-访问者模式(Visitor)
- 设计模式之visitor访问者模式
- Java设计模式-----Visitor访问者模式
- 设计模式—Visitor访问者模式
- 设计模式18:Visitor Pattern (访问者模式)
- 设计模式之访问者(visitor)模式
- 设计模式(23)-访问者模式(Visitor)
- 设计模式之访问者模式(Visitor)
- maven如何使用全教程
- 支持并行数据库的并行结构
- Split
- .net gridview根据时间节点改变字体颜色
- rtems交叉编译工具的安装
- C++设计模式实现--访问者(Visitor)模式
- 苹果receipt样例
- UVA 10129 Play on Words
- Python脚本运行出现语法错误:IndentationError: unindent does not match any outer indentation level
- xcode一直显示waiting for XXX to launch,模拟器跑不起来,解决方法!
- android 音量键消息
- luatinker 的使用
- dhcp交叉编译
- Oracle函数样板及用法