博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Visitor
阅读量:4705 次
发布时间:2019-06-10

本文共 2111 字,大约阅读时间需要 7 分钟。

//详细的在23种设计模式 4.3

//1) 访问者角色(Visitor):为该对象结构中具体元素角色声明一个访问操作接口。该操作

//接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色。这样访问者就可
//以通过该元素角色的特定接口直接访问它。
//2) 具体访问者角色(Concrete Visitor):实现每个由访问者角色(Visitor)声明的操作。
//3) 元素角色(Element):定义一个Accept 操作,它以一个访问者为参数。
//4) 具体元素角色(Concrete Element):实现由元素角色提供的Accept 操作。
//5) 对象结构角色(Object Structure):这是使用访问者模式必备的角色。它要具备以下特
//征:能枚举它的元素;可以提供一个高层的接口以允许该访问者访问它的元素;可以是
//一个复合(组合模式)或是一个集合,如一个列表或一个无序集合。
//
//
//《设计模式》一书对于访问者模式给出的定义为:表示一个作用于某对象结构中的各元素的操作

class ConcreteElementA;

class ConcreteElementB;
class Element;

class Visitor

{
public:
 virtual ~Visitor();

 virtual void VisitConcreteElementA(Element* elm) = 0;

 virtual void VisitConcreteElementB(Element* elm) = 0;

protected:

 Visitor();

private:
};

class ConcreteVisitorA:public Visitor

{
public:

 ConcreteVisitorA();

 virtual ~ConcreteVisitorA();

 virtual void VisitConcreteElementA(Element* elm)

 {
  cout<<"i will visit ConcreteElementA..."<<endl;
 }

 virtual void VisitConcreteElementB(Element* elm)

 {
  cout<<"i will visit ConcreteElementB..."<<endl;
 }
protected:
private:
};

class ConcreteVisitorB:public Visitor

{
public:

 ConcreteVisitorB();

 virtual ~ConcreteVisitorB();

 virtual void VisitConcreteElementA(Element* elm)

 {
  cout<<"i will visit ConcreteElementA..."<<endl;
 }

 virtual void VisitConcreteElementB(Element* elm)

 {
  cout<<"i will visit ConcreteElementB..."<<endl;
 }
protected:
 private:
};

class Element

{
public:

 virtual ~Element();

 virtual void Accept(Visitor* vis) = 0;

protected:

 Element();

private:
};

class ConcreteElementA:public Element

{
public:

 ConcreteElementA();

 ~ConcreteElementA();

 void Accept(Visitor* vis)

 {
  vis->VisitConcreteElementA(this);

  cout<<"visiting ConcreteElementA..."<<endl;

 }
protected:
private:
};

class ConcreteElementB:public Element

{
public:

 ConcreteElementB();

 ~ConcreteElementB();

 void Accept(Visitor* vis)

 {
  cout<<"visiting ConcreteElementB..."<<endl;

  vis->VisitConcreteElementB(this);

 }
protected:
private:
};

void Visitor_test(int argc,char* argv[])

{
 Visitor* vis = new ConcreteVisitorA();

 Element* elm = new ConcreteElementA();

 elm->Accept(vis);

 return;

}

转载于:https://www.cnblogs.com/sssssnian/p/3748593.html

你可能感兴趣的文章
解密EXL
查看>>
简易版cnlog
查看>>
erlang程序运行的几种方式
查看>>
堆heap和栈Stack(百科)
查看>>
html5页面实现点击复制功能
查看>>
633. 寻找重复的数
查看>>
沉淀,再出发:python中的pandas包
查看>>
Rule 12: Remove Duplicate Scripts(Chapter 12 of High performance Web Sites)
查看>>
缓存服务的更新策略有哪些?
查看>>
php, nginx高并发优化
查看>>
python内置魔法方法
查看>>
Python自学DAY03
查看>>
兴趣问题清单
查看>>
力扣——N叉树的后序遍历
查看>>
C++ namespace命名空间
查看>>
用Hadoop构建电影推荐系统
查看>>
automake连载---关于两个文件configure.in和Makefile.am的编写
查看>>
JQuery选择器中含有冒号的ID处理差异的分析
查看>>
分享:一款前端布局工具(alloydesigner)
查看>>
python模拟老师授课下课情景
查看>>