访问者模式

时间:2022-04-26
本文章向大家介绍访问者模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、简介

1、访问者模式表示一个作用于某对象结构中各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

2、模式中的成员角色

访问者(Visitor)   :访问者抽象接口,通过visit(Element)方法访问Element(数据结构),完成对Element的操作行为。 具体访问者(ConcreteVisitor):访问者的具体实现类。 元素(Element),也就是被访问者,通过accept(Visitor)方法接受Visitor的访问。 具体元素(ConcreteElement)   元素的具体实现类。 对象结构(ObjectStructure)  拥有一组元素的组合对象。ObjectStructure本身也可以作为被访问者。

3、UML

4、所属类别:行为型

二、C++程序

  1 // 访问者模式.cpp : 定义控制台应用程序的入口点。
  2 //
  3 
  4 #include "stdafx.h"
  5 #include<iostream>
  6 #include<string>
  7 #include<list>
  8 using namespace std;
  9 //被访问者类声明
 10 class Person;
 11 //访问者类声明
 12 class Visiter ;
 13 //public:
 14     //virtual void print_sproter(Person *)=0;
 15     //virtual void print_judgement(Person *)=0;
 16 
 17 //被访问者抽象类
 18 class Person
 19 {
 20 public:
 21     Person(){}
 22     virtual ~Person(){}
 23     virtual string getname()=0;
 24     virtual string getNo()=0;
 25     virtual void accept(Visiter *)=0;
 26 };
 27 //访问者抽象类
 28 class Visiter 
 29 {
 30 public:
 31     Visiter(){}
 32     virtual ~Visiter(){}
 33     virtual void print_sproter(Person *)=0;
 34     virtual void print_judgement(Person *)=0;
 35 };
 36 //具体的被访问者1
 37 class Sporter  :public Person
 38 {
 39 private:
 40     string name;//姓名
 41     string No;  //编号
 42 public:
 43     Sporter(string n,string N)
 44     {
 45         name=n;
 46         No=N;
 47     }
 48     virtual~Sporter(){}
 49     virtual void accept(Visiter *visiter)
 50     {
 51         visiter->print_sproter(this);
 52     }
 53     virtual string getname()
 54     {
 55         return name;
 56     }
 57     virtual string getNo()
 58     {
 59         return No;
 60     }
 61 };
 62 //具体的被访问者2
 63 class Judgement  :public Person
 64 {
 65 private:
 66     string name;//姓名
 67 public:
 68     Judgement(string n)
 69     {
 70         name=n;
 71     }
 72     virtual~Judgement(){}
 73     virtual void accept(Visiter *visiter)
 74     {
 75         visiter->print_judgement(this);
 76     }
 77     virtual string getname()
 78     {
 79         return name;
 80     }
 81     virtual string getNo()
 82     {
 83         return 0;
 84     }
 85 };
 86 
 87 //具体的访问者类
 88 class Concretevisitor:public Visiter
 89 {
 90 public:
 91     Concretevisitor(){}
 92     virtual ~Concretevisitor(){}
 93     virtual void print_sproter(Person *people)
 94     {
 95         cout<<"运动员"<<endl;
 96         cout<<"name:"<<people->getname()<<endl;
 97         cout<<"No:"<<people->getNo()<<endl;
 98     }
 99     virtual void print_judgement(Person *people)
100     {
101         cout<<"裁判"<<endl;
102         cout<<"name:"<<people->getname()<<endl;
103     }
104 };
105 
106 //被访问者的具体对象结构
107 class Objectstructure
108 {
109 private:
110     list<Person*> persons;
111 public:
112     Objectstructure(){}
113     ~Objectstructure(){}
114     void add(Person* people)
115     {
116         persons.push_back(people);
117     }
118     void remove(Person* people)
119     {
120         persons.remove(people);
121     }
122     void accept(Visiter* visiter)
123     {
124         list<Person*>::iterator it=persons.begin();
125         for(;it!=persons.end();it++)
126         {
127             (*it)->accept(visiter);
128         }
129     }
130 };
131 
132 int _tmain(int argc, _TCHAR* argv[])
133 {
134     Objectstructure* yundonghui=new Objectstructure();//新建一个运动会的对象结构
135     Sporter * zhangsan=new Sporter("张三","0001");
136     Sporter * lisi=new Sporter("李四","0002");
137     Sporter * wangwu=new Sporter("王五","0003");
138     Judgement* liu=new Judgement("刘裁判");
139     yundonghui->add(zhangsan);
140     yundonghui->add(lisi);
141     yundonghui->add(wangwu);
142     yundonghui->add(liu);
143 
144     Concretevisitor *notify=new Concretevisitor();
145 
146     cout<<"比赛即将开始,请下列运动员和裁判到检录台检录:"<<endl;
147     yundonghui->accept(notify);
148     return 0;
149 }