访问者模式详解

news2024/12/31 6:06:18

访问者模式

简介: 类的内部结构不变的情况下,不同的访问者访问这个对象都会呈现出不同的处理方式。
人话: 其实就是为了解决类结构不变但操作处理逻辑易变的问题,把对数据的操作都封装到访问者类中,
我们只需要调用不同的访问者,而无需改变改变结构类,实现了。

举个理发店的例子

理发店:
用户分为: 普通用户 和 会员用户
toney老师分为: 技师, 总监, 店长
不通的用户有不通的老师

正常思路:
一个客户类, 一个理发师类
然后理发师类中针对不通的客户进行收费

问题: 
我们不想动理发师类, 因为在理发店的这个环境下, 理发师类肯定是比消费者类复杂很多的, 所以我们
使用访问者模式, 将数据的处理逻辑放到访问者里面, 这样理发师就不用经常修改了

访问者模式:
访问者类: 客户类, 实现visit方法
被访问者类: 理发师类, 实现accept方法

`代码``如下所示

class ToneyTeacher;

class Customer
{
public:
	string name;
	Customer(string n) : name(n) {};
	virtual double visit(ToneyTeacher* t) =0;
};


class ToneyTeacher
{
private:
	int price = 0;
	string name;
public:
	ToneyTeacher(string n, int p) :name(n), price(p) {};
	int get_price() { return price; };
	ToneyTeacher(int p) : price(p) {};
	void accept(Customer* c);
};



class NormalCustomer : public Customer
{
public:
	NormalCustomer(string name) : Customer(name) {};
	double visit(ToneyTeacher* t) override
	{
		return 1 * t->get_price();
	}
};


class VIPCustomer : public Customer
{
public:
	VIPCustomer(string name) : Customer(name) {};
	double visit(ToneyTeacher* t) override
	{
		return 0.8 * t->get_price();
	}
};


void ToneyTeacher::accept(Customer* c)
{
	cout << name << "原价: " << price << ", 收 " << c->name << " 费用: " << c->visit(this) << endl;
}


int main()
{

	VIPCustomer* vip_c = new VIPCustomer("vip客户");
	NormalCustomer* normal_c = new NormalCustomer("普通客户");

	ToneyTeacher* t1 = new ToneyTeacher("技师", 10);
	ToneyTeacher* t2 = new ToneyTeacher("总监", 20);
	ToneyTeacher* t3 = new ToneyTeacher("店长", 30);

	t1->accept(vip_c);
	t2->accept(vip_c);
	t3->accept(vip_c);

	t1->accept(normal_c);
	t2->accept(normal_c);
	t3->accept(normal_c);

	return 0;
}

执行结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2078447.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端算法 === 力扣 111 二叉树的最小深度

目录 问题描述 DFS&#xff08;深度优先搜索&#xff09;方案 BFS&#xff08;广度优先搜索&#xff09;方案 总结 力扣&#xff08;LeetCode&#xff09;上的题目111是关于二叉树的最小深度问题。这个问题可以通过深度优先搜索&#xff08;DFS&#xff09;和广度优先搜索&…

Start OpenAI gym on arbitrary initial state

题意&#xff1a;“在任意初始状态下启动 OpenAI Gym” 问题背景&#xff1a; Anybody knows any OpenAI Gym environments where we can set the initial state of the game? For example, I found the MountainCarContinuous-v0 can do such thing so that we can select a…

游戏+AI

我们来聊聊AI【作者声明&#xff0c;个人观点&#xff0c;欢迎友好讨论】 我想这也是很多目前为止很多投资者对于AI举旗不定&#xff0c;不敢投资&#xff0c;业内游戏行业目前正式商用产品也是寥寥无几。 AI全称Artificial Intelligence&#xff0c;中文译名人工智能。人类从工…

信息打点-Web架构篇域名语言中间件数据库系统源码获取

知识点&#xff1a; 1、打点-Web架构-语言&中间件&数据库&系统等 2、打点-Web源码-CMS开源&闭源售卖&自主研发等 CMS&#xff1a;网站程序源码是可以通过搜索引擎搜索到并且下载的&#xff1b; 闭源售卖&#xff1a;不是一个开源的&#xff0c;要么从内…

【网络安全】分析重置密码功能实现账户接管

未经许可,不得转载。 文章目录 正文正文 目标为“target.com”,我执行了一些正常操作,比如创建或删除某些内容来保存 API 请求,然后检查是否存在任何 idor 或访问控制错误。然而,我没发现漏洞。 接着,我读取 JavaScript 文件来检查是否存在任何敏感信息,但一无所获。 …

浅谈 @Transtational 原理 及其失效场景(1)

上篇讲述了 当Transtctional遇到Async遇碰撞出怎样的火花&#xff1f; 本篇则主要从Transtational出发仔细谈谈。 一、调用场景复现&#xff0c;代码层面什么情况会失效&#xff1f; 1&#xff09;同类操作&#xff1a;事物A调取非事物B&#xff0c;A报错/B报错&#xff08;事…

流体力学解迷宫

诶&#xff0c;我手机呢&#xff1f;我手机放哪了&#xff1f;我手机是不是落餐厅了&#xff1f;会议室&#xff1f;厕所&#xff1f; 最近脑子有点不好使&#xff0c;可能需要练一练……解解迷宫吧 怕脑子吃不消&#xff0c;从简单的开始&#xff0c;不错&#xff0c;轻松拿…

EEtrade:黄金首饰是不是越软越好

黄金一直以来都是人们喜爱的贵金属之一。许多人在购买黄金首饰时&#xff0c;常常会关注黄金的纯度和硬度。那么&#xff0c;黄金首饰是不是越软越好呢?本文将详细探讨这个问题&#xff0c;并分析黄金首饰的硬度与其使用和美观性的关系。 黄金的纯度与硬度 黄金纯度 黄金的…

Linux系列之基础篇

文章目录 开篇明义基础篇实际操作篇高级篇Linux之JavaEELinux在哪些地方使用Linux应用领域 Linux入门基本介绍Linux和Unix关系 VM和Linux的安装基本说明安装VM17.5安装Centos7.6网络连接解释 虚拟机克隆虚拟机快照虚拟机迁移和删除安装vmtools设置共享文件夹 Linux目录结构 开篇…

屏幕翻译app下载哪个?高效学习工作必备

新学期即将开始&#xff0c;无论是线上学习还是筹备假期的海外交流&#xff0c;面对满屏的外文资料&#xff0c;一款得心应手的屏幕翻译软件成为必备利器。 幸运的是&#xff0c;现在有许多免费且功能强大的屏幕翻译工具&#xff0c;能够让你的学习与旅行更加顺畅。 以下是五…

Win7 配置Oracle 11G R2、PLSQL Development、添加用户名、远程访问数据库

本教程所有操作均在VMWare虚拟机上操作&#xff0c;Oracle这种又难装、又难卸、污染性这么大的程序&#xff0c;怎么会让他出现在我的生产环境中呢&#xff1f;自己在虚拟机上新建了一个Win7_x64的系统&#xff0c;进行Oracle安装测试。 1.Oracle文件的获取 网上有很多下载这…

LabVIEW便携涡流检测系统开发

针对便携式脉冲涡流检测系统的开发需求&#xff0c;使用LabVIEW进行软件设计与实现。系统需要集成对铁磁性和非铁磁性材料的检测功能&#xff0c;并提供友好的用户界面&#xff0c;便于操作与数据读取。 硬件选型&#xff1a; 脉冲涡流主机&#xff1a; 选择理由&#xff1a; …

【Liunx入门】Liunx换源

文章目录 前言一、备份默认源文件1.配置文件路径2.备份源文件 二、换源1.查看Ubuntu版本2.镜像源地址1&#xff09;清华源2&#xff09;阿里源3&#xff09;中科大源 3.换源 三、更新镜像源总结 前言 由于Liunx系统默认的下载源为国外的源&#xff0c;所以在国内下载资源比较慢…

1+X 职业技能等级证书面向哪些人群介绍

日前&#xff0c;“大数据应用开发&#xff08;Python&#xff09;”职业技能等级证书已开放面向社会人员招生。 什么是1X职业技能等级证书&#xff1f; “1” 学历证书&#xff0c;代表专业&#xff0c;即学历、毕业 “X” 若干职业技能等级证书&#xff0c;是根据…

虫情系统的重要作用

在农业生产、林业管理和生态保护的广阔领域中&#xff0c;虫情监测系统如同一双锐利的眼睛&#xff0c;时刻关注着农田中的细微变化&#xff0c;为农作物的健康生长保驾护航。这一系统的引入&#xff0c;不仅标志着农业管理向智能化、准确化迈出了重要一步&#xff0c;更在提升…

vue postcss postcss-pxtorem 页面自适应 动态

vue postcss postcss-pxtorem 页面自适应 动态 postcss-pxtorem实现页面自适应1、安装postcss-pxtorem2、根目录创建postcss.config.js&#xff0c;并配置以下内容3、创建rem.js&#xff0c;动态设置root px4、在main.js中引入rem.js5、在main.js中创建全局处理函数px2rem6、对…

上海亚商投顾:沪指震荡微涨 固态电池、折叠屏概念股集体大涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日窄幅震荡&#xff0c;黄白二线分化明显&#xff0c;微盘股指数涨超2.5%&#xff0c;题材概念较为活跃…

【渗透测试】ATTCK靶场一,phpmyadmin,域渗透,内网横向移动攻略

前言 博客主页&#xff1a;h0ack1r丶羽~ 从0到1~ VulnStack&#xff0c;作为红日安全团队匠心打造的知识平台&#xff0c;其独特优势在于全面模拟了国内企业的实际业务场景&#xff0c;涵盖了CMS、漏洞管理及域管理等核心要素。这一设计理念源于红日安全团队对ATT&CK红队评…

VBA之正则表达式(47)-- 快速将公式转换为静态值计算

实例需求&#xff1a;工作表I列包含多种计算公式&#xff0c;为了便于演示&#xff0c;将I列公式显示在J列单元格中&#xff0c;现在需要将公式的单元格引用转换为静态值&#xff0c;如K列所示。 示例代码如下。 Sub RegExpDemoReplace()Dim Res()Dim objRegEx As ObjectDim o…

零基础5分钟上手亚马逊云科技-NLP文字理解AI服务

简介&#xff1a; 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列&#xff0c;适用于任何无云计算或者亚马逊云科技技术背景的开发者&#xff0c;通过这篇文章大家零基础5分钟就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我会每天介绍一个基于亚马逊云科技…