訪问者设计模式是已经有了一组Person对象了,然后不同的訪问者訪问这组对象。会有不同效果。

这些訪问者实际上就是一个能够让Person对象组运行的动作行为等。

至于这些Person对象是怎样运行这些訪问者的动作的,那是已经在特定的不同的Person对象中设计好的。

比方我们的訪问者或许是一些动作集合的类,如:

class Action
{
public:
string present;
string gun;
virtual void drinkBeer(Person *p) = 0;
virtual void getAGun(Person *p) = 0;
};

依据这个訪问者基类定义不同的訪问动作:

class ActionOne:public Action
{
public:
ActionOne()
{
present = "Alcohol";
gun = "Laiser";
}
void drinkBeer(Person *p);
void getAGun(Person *p);
}; class ActionTwo:public Action
{
public:
ActionTwo()
{
present = "Beer";
gun = "Machine Gun";
}
void getAGun(Person *p);
void drinkBeer(Person *p);
};

而Person类则运行动作类的不同动作,也是基类动作的一部分,这样呈现出不同Person运行的行为不一样。

class Person
{
public:
string something;
virtual void receivedVisitor(Action *visitor) = 0;
}; class Bill:public Person
{
public:
Bill()
{
something = "food";
}
void receivedVisitor(Action *visitor)
{
puts("\nVisitor to Bill bring :");
puts(visitor->present.c_str());
visitor->drinkBeer(this);
}
}; class Mark:public Person
{
public:
Mark()
{
something = "Weapon";
}
void receivedVisitor(Action *visitor)
{
puts("\nVisitor to Mark bring :");
puts(visitor->gun.c_str());
visitor->getAGun(this);
}
};

使用一个类来存放这些对象:

class House
{
protected:
vector<Person *> vps;
public:
void addPerson(Person *p)
{
vps.push_back(p);
}
void receiver(Action *visitor)
{
for (int i = 0; i < (int)vps.size(); i++)
{
vps[i]->receivedVisitor(visitor);
}
}
~House()
{
for (int i = 0; i < (int)vps.size(); i++)
{
delete vps[i];
}
}
};

最后就在这个类对象中存放须要被訪问的对象,然后使用动作类来訪问这些对象。

总的来说也是思想并不太难的一个设计模式,可是要非常好实现还是不太easy的。

所有代码例如以下:

#include <stdio.h>
#include <iostream>
#include <string>
#include <vector>
using namespace std; class Person; class Action
{
public:
string present;
string gun;
virtual void drinkBeer(Person *p) = 0;
virtual void getAGun(Person *p) = 0;
}; class ActionOne:public Action
{
public:
ActionOne()
{
present = "Alcohol";
gun = "Laiser";
}
void drinkBeer(Person *p);
void getAGun(Person *p);
}; class ActionTwo:public Action
{
public:
ActionTwo()
{
present = "Beer";
gun = "Machine Gun";
}
void getAGun(Person *p);
void drinkBeer(Person *p);
}; class Person
{
public:
string something;
virtual void receivedVisitor(Action *visitor) = 0;
}; class Bill:public Person
{
public:
Bill()
{
something = "food";
}
void receivedVisitor(Action *visitor)
{
puts("\nVisitor to Bill bring :");
puts(visitor->present.c_str());
visitor->drinkBeer(this);
}
}; class Mark:public Person
{
public:
Mark()
{
something = "Weapon";
}
void receivedVisitor(Action *visitor)
{
puts("\nVisitor to Mark bring :");
puts(visitor->gun.c_str());
visitor->getAGun(this);
}
}; void ActionOne::drinkBeer(Person *p)
{
puts("Let's eat something");
puts(p->something.c_str());
} void ActionOne::getAGun(Person *p)
{
puts("Let's gear up");
puts(p->something.c_str());
} void ActionTwo::getAGun(Person *p)
{
puts("Let's gear up");
puts(p->something.c_str());
} void ActionTwo::drinkBeer(Person *p)
{
puts("Let's eat something");
puts(p->something.c_str());
} class House
{
protected:
vector<Person *> vps;
public:
void addPerson(Person *p)
{
vps.push_back(p);
}
void receiver(Action *visitor)
{
for (int i = 0; i < (int)vps.size(); i++)
{
vps[i]->receivedVisitor(visitor);
}
}
~House()
{
for (int i = 0; i < (int)vps.size(); i++)
{
delete vps[i];
}
}
}; int main()
{
House house;
house.addPerson(new Bill);
house.addPerson(new Mark);
ActionTwo gun;
ActionOne drink;
house.receiver(&gun);
house.receiver(&drink);
return 0;
}

运行:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2VuZGVuMjM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

最新文章

  1. Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)
  2. 清华学堂 Range
  3. SMTP Error: Could not connect to SMTP host
  4. Java学习笔记(五)
  5. I am back-电商网站开发&amp;jQuery
  6. 6-03使用SQL语句一次型向表中插入多行数据
  7. 配置DNS实验一例
  8. Nginx负载均衡 后端服务器怎么共享Session 问题
  9. Ubuntu16.04 安装openjdk-7-jdk
  10. SpringMVC 服务器端验证
  11. 第一个Sprint冲刺第七天
  12. angular中的jsonp记录
  13. PullToRefreshListView上拉加载、下拉刷新
  14. JAVA 中一个非常轻量级只有 200k 左右的 RESTful 路由框架
  15. 从零开始写自己的PHP框架系列教程(二)[App.php]
  16. SaltStack 理解
  17. iptables转发技术
  18. web.py框架之i18n支持
  19. scala private
  20. jquery使用ajax

热门文章

  1. uva1439 Exclusive Access 2
  2. arx 地址
  3. sqlserver还原3101
  4. JS简单实现防抖和节流
  5. luogu P1205 方块转换
  6. set容器几个关键函数
  7. [POJ] 2223 Muddy Fields
  8. java反编译工具jad
  9. &lt;c:foreach&gt; &lt;c:forTokens&gt;
  10. PAT 1010. 一元多项式求导