访问者模式详解

2024-08-27 14:36
文章标签 模式 详解 访问者

本文主要是介绍访问者模式详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

访问者模式

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

举个理发店的例子

理发店:
用户分为: 普通用户 和 会员用户
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.chinasem.cn/article/1111942

相关文章

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

Java中八大包装类举例详解(通俗易懂)

《Java中八大包装类举例详解(通俗易懂)》:本文主要介绍Java中的包装类,包括它们的作用、特点、用途以及如何进行装箱和拆箱,包装类还提供了许多实用方法,如转换、获取基本类型值、比较和类型检测,... 目录一、包装类(Wrapper Class)1、简要介绍2、包装类特点3、包装类用途二、装箱和拆箱1、装

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要