访问者模式
时间: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 }
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- linux配置SOCK5代理
- 前端踩坑系列《五》
- linux上安装mitmproxy
- Jmeter(二十三) - 从入门到精通 - JMeter函数 - 上篇(详解教程)
- Elasticsearch学习笔记 -- 1
- Jmeter(二十四) - 从入门到精通 - JMeter函数 - 中篇(详解教程)
- [javascript] elementui和vue下复制粘贴上传图片
- SQL Server通过创建临时表遍历更新数据
- 对于 JavaScript 中循环之间的技术差异概述
- 初识 webpack 原理——自定义插件
- 高性能解决线程饥饿的利器 StampedLock
- 前端应该知道的web调试工具——whistle
- 最强大的 CSS 布局 —— Grid 布局
- SAP Spartacus ProductConnector和ProductService实现
- Sorted Adjacent Differences(CodeForces - 1339B)【思维+贪心】