设计模式---访问者模式(C++实现)

/*************************************************************************************************************
适用于:
把数据结构 和 作用于数据结构上的操作 进行解耦合;
适用于数据结构比较稳定的场合
访问者模式总结:
访问者模式优点是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。
访问者模式将有关的行为集中到一个访问者对象中。那访问者模式的缺点是是增加新的数据结构变得困难了


实现数据结构   和操作数据结构的动作     进行有效的分离
实现方法: 
分别定义访问者接口(数据结构的基类指针)    公园部分访问接口(访问者的指针接口)+  接受访问的内部实现了访问函数的调用
如果要管理访问者增加超级访问者,使用集合将其封装,然后遍历集合
**************************************************************************************************************/
/* 案例需求:
比如有一个公园,有一到多个不同的组成部分;该公园存在多个访问者:清洁工A负责打扫公园的A部分,清洁工B负责打扫公园的B部分,
公园的管理者负责检点各项事务是否完成,上级领导可以视察公园等等。也就是说,对于同一个公园,不同的访问者有不同的行为操作,
而且访问者的种类也可能需要根据时间的推移而变化(行为的扩展性)*/
#include <iostream>
#include <list>
#include <string>
using namespace std;
class  ParkElement;
class Visitor//不同的访问者 访问公园完成不同的动作 
{
public:
virtual void visit(ParkElement *park) = 0;
};
class ParkElement//公园不同的部分接受不同的访问者
{
public:
virtual void accept(Visitor *v) = 0;
};
class ParkA : public ParkElement  //公园A部分接受访问者
{
public:
virtual void accept(Visitor *v){
v->visit(this);}//传来的谁,去回调它是访问函数
};
class ParkB : public ParkElement//公园B部分接受访问者
{
public:
virtual void accept(Visitor *v) {
v->visit(this);}
};
class Park : public ParkElement
{ //公园的部分可以进行集中管理
public:
Park(){
m_list.clear(); }
void setPart(ParkElement *e){
m_list.push_back(e);}
public:
void accept(Visitor *v)
{
for (list<ParkElement *>::iterator it = m_list.begin(); it != m_list.end(); it++)
{ (*it)->accept(v);}
}
private:
list<ParkElement *> m_list;
};
class VisitorA : public Visitor//访问者A
{
public:
virtual void visit(ParkElement *park){
cout << "清洁工A 访问 公园A 部分,打扫卫生完毕" << endl;}
};


class VisitorB : public Visitor//访问者B
{
public:
virtual void visit(ParkElement *park){
cout << "清洁工B 访问 公园B 部分,打扫卫生完毕" << endl;}
};
class VisitorManager : public Visitor//访问者管理员
{
public:
virtual void visit(ParkElement *park)
{ cout << "管理员 检查 此部分卫生情况" << endl;}
};


void main()
{
VisitorA *visitorA = new VisitorA;//创建访问者A
VisitorB *visitorB = new VisitorB;//创建访问者B


ParkA *partA = new ParkA;//创建数据结构  A
ParkB *partB = new ParkB;//创建数据结构  B


partA->accept(visitorA); //公园接受访问者A访问 + 在这个函数中封装了visitorA去访问公园A部分
partB->accept(visitorB); //公园接受访问者B访问 + 在这个函数中封装了visitorA去访问公园B部分


VisitorManager *visitorManager = new VisitorManager;
Park * park = new Park;
park->setPart(partA);  //将A部分加入容器
park->setPart(partB);  //将B部分加入容器
park->accept(visitorManager); //管理员去检查A部分 +  管理员去检查B部分
//遍历容器,接受visitorManager访问,去调用visitorManager的访问函数
system("pause");

}

参考:传智播客--王保明

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值