当前位置: 首页 > article >正文

访问者模式详解

访问者模式

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

举个理发店的例子

理发店:
用户分为: 普通用户 和 会员用户
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.kler.cn/news/285257.html

相关文章:

  • 【摸鱼笔记】python 提取和采集 finereport 未绑定目录的报表模板
  • GPT-SoVITS:零样本语音合成AI
  • 如何使用pytest的fixtures以及pytest-dependency插件来管理接口之间的依赖关系(下)
  • V8 引擎的核心架构
  • DCB简介
  • Python入门全解析丨Part3-Python的循环语句
  • 英语2-小作文
  • Java | Leetcode Java题解之第386题字典序排数
  • 性能优化笔记二(本地缓存)
  • 05:【江科大stm32】:定时器输出比较功能(PWM)
  • Android 优化之 查找so 文件的来源
  • Camtasia 2024 v2024.0.6 for Mac 中文版 屏幕录像视频录制编辑软件
  • 找出两个序列的中位数
  • Python3.0以后各个版本区别介绍
  • 网络模型及协议介绍
  • STM32原理图一些引脚VDDA/VSSA/VBAT/OSC/NRST/BOOT
  • 随手记录第十五话 -- Spring Boot 3.2.3+Grafana+Prometheus+Loki实现一套轻量级监控加日志收集系统
  • 波导阵列天线单元学习笔记7 一种用直接金属激光烧结考虑的轻质量,宽带,双圆极化波导腔体阵列
  • Datawhale X 李宏毅苹果书 AI夏令营 Task2打卡
  • c++命令模式
  • Vscode推送代码到 Gitee
  • 关于一个早期的计算机网络的理解
  • Nginx 负载均衡深入指南:`proxy_pass` 指令的高效使用
  • Nginx: 负载均衡场景下上游服务器异常时的容错机制
  • docker python 3.11 容器报错
  • Windows连接虚拟机中的mysql5失败
  • C程序设计(潭浩强教授版)精选程序题
  • Bluetooth: gatt profile
  • 学习之SQL语句之DCL(数据控制语言)
  • 广电手机卡靠谱吗?