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

Python访问者模式介绍、使用

目录

一、Python访问者模式介绍

二、访问者模式使用


一、Python访问者模式介绍

访问者模式(Visitor Pattern)是一种行为型设计模式,它能够将算法与对象结构分离,使得算法可以独立于对象结构而变化。这个模式的主要思想是,将对象结构和算法分离开来,使得算法可以独立于对象结构而变化。该模式的核心概念是,定义一个访问者对象,它是对某个对象结构中各个元素的操作,这种操作可以改变元素的类或状态。

访问者模式的主要功能是,提供一个统一的访问接口,使得访问者能够遍历整个对象结构,对各个元素进行操作。

优点:

1、访问者模式可以将数据结构与算法分离,增强了代码的可扩展性和可维护性。

2、访问者模式可以更加灵活地适应不同的对象结构,易于扩展。

3、访问者模式可以实现双重分派,提高了代码的灵活性和可复用性。

缺点:

1、访问者模式增加了代码的复杂度,需要定义访问者类和被访问类。

2、访问者模式扩展起来比较困难,新增元素需要修改访问者接口,并且所有访问者实现类都需要进行修改。

应用场景:

1、需要对复杂的对象结构进行遍历,并对其中的元素进行不同的操作。

2、需要对对象结构中的不同元素进行不同的操作,例如对不同类型的节点进行不同的访问。

访问者模式的使用方式一般包括两个主要步骤:

1、定义访问者接口,包含对不同类型元素的不同访问方法。

2、定义被访问者接口,包含接受访问者访问的方法,这个方法会调用访问者对当前对象进行访问。

在应用程序开发中,访问者模式可以用于图形编辑器、编译器、XML解析器等需要对复杂的对象结构进行遍历和操作的场景。其工作原理是,访问者模式通过定义访问者接口和被访问者接口,将遍历和操作分离开来,从而提高代码的可维护性和可扩展性。当访问者需要访问被访问者的某个元素时,它会调用该元素的accept方法,并将自己作为参数传递给该方法,从而实现对元素的访问。

二、访问者模式使用

假设有一个程序需要对不同类型的员工进行计算工资,员工的类型包括全职员工和兼职员工,全职员工有基本工资和奖金,兼职员工只有小时工资。这个程序使用访问者模式来实现,可以分为以下几个步骤:

1、定义访问者接口SalaryVisitor,包含对不同类型员工进行访问的方法visit_fulltime和visit_parttime:

2、定义被访问者接口Employee,包含接受访问者访问的方法accept,该方法会根据当前员工的类型调用访问者的对应方法:

3、定义具体的访问者类TaxSalaryVisitor和BonusSalaryVisitor,分别实现对全职员工和兼职员工的计算方法:

4、在程序中使用访问者模式进行计算,首先创建不同类型的员工对象,然后创建访问者对象,最后调用员工对象的accept方法传入访问者对象进行访问:

# 访问者模式# 定义访问者接口
class SalaryVisitor():def visit_fullltime(self): # 全职员工passdef visit_parttime(self):  # 兼职员工pass# 定义被访问者接口
class Employee():def accept(self, visitor): # 接受访问passclass FulltimeEmployee(Employee):def __init__(self, base_salary, bonus): # 全职员工:基本工资、奖金self.base_salary = base_salaryself.bonus = bonusdef accept(self, visitor):return visitor.visit_fullltime(self)class ParttimeEmployee(Employee):def __init__(self, hourly_wage, total_hours): # 兼职员工:时薪,小时self.hourly_wage = hourly_wageself.total_hours = total_hoursdef accept(self, visitor):return visitor.visit_parttime(self)# 定义具体的访问者类
class TaxSalaryVisitor(SalaryVisitor):def visit_fullltime(self, fulltime_employee):tax = (fulltime_employee.base_salary + fulltime_employee.bonus) * 0.1return taxdef visit_parttime(self, parttime_employee):tax = parttime_employee.hourly_wage * parttime_employee.total_hours * 0.1return taxclass BonusSalaryVisitor(SalaryVisitor):def visit_fullltime(self, fulltime_employee):bonus = fulltime_employee.bonusreturn bonusdef visit_parttime(self, parttime_employee):return 0# 创建实例
fulltime_employee = FulltimeEmployee(10000, 5000)
parttime_employee = ParttimeEmployee(50, 160)tax_visitor = TaxSalaryVisitor()
bonus_visitor= BonusSalaryVisitor()full_tax = fulltime_employee.accept(tax_visitor)
full_bonus = fulltime_employee.accept(bonus_visitor)part_tax = parttime_employee.accept(tax_visitor)
part_bonus = parttime_employee.accept(bonus_visitor)print(f"全职员工:税:{full_tax},  奖金:{full_bonus}")
print(f"兼职员工:税:{part_tax},  奖金:{part_bonus}")

运行结果:

全职员工:税:1500.0,  奖金:5000
兼职员工:税:800.0,  奖金:0

这个程序的工作原理是,定义了访问者接口和被访问者接口,将遍历和操作分离开来,从而实现了对不同类型员工的计算。当访问者需要访问被访问者的某个元素时,它会调用该元素的accept方法,并将自己作为参数传递给该方法,从而实现对元素的访问。

使用访问者模式的方法是,首先定义访问者接口和被访问者接口,然后在被访问者接口中定义accept方法,根据被访问者的类型调用访问者的对应方法。在定义具体的访问者类时,需要实现对不同类型被访问者的具体操作。最后,在程序中创建不同类型的被访问者对象和访问者对象,通过调用accept方法进行访问和操作。

相关文章:

Python访问者模式介绍、使用

目录 一、Python访问者模式介绍 二、访问者模式使用 一、Python访问者模式介绍 访问者模式(Visitor Pattern)是一种行为型设计模式,它能够将算法与对象结构分离,使得算法可以独立于对象结构而变化。这个模式的主要思想是&#…...

深度学习实际使用经验总结

以下仅是个人在使用过程中的经验总结,请谨慎参考。 常用算法总结 图像分类 常用算法(可作为其他任务的骨干网络):服务端:VGG、ResNet、ResNeXt、DenseNet移动端:MobileNet、ShuffleNet等适用场景&#x…...

【广州华锐互动】AR智慧机房设备巡检系统

AR智慧机房设备巡检系统是一种新型的机房巡检方式,它通过使用增强现实技术将机房设备、环境等信息实时呈现在用户面前,让巡检人员可以更加高效地完成巡检任务。 首先,AR智慧机房设备巡检系统具有极高的智能化程度。该系统可以根据用户设定的…...

关于Ubuntu 18.04 LTS环境下运行程序出现的问题

关于Ubuntu 18.04 LTS环境下运行程序出现的问题 1.运行程序时出现以下情况 2.检查版本 strings /lib/x86_64-linux-gnu/libc.so.6 |grep GLIBC_​ 发现Ubuntu18.04下的glibc版本最高为2.27,而现程序所使用的是glibc2.34,所以没办法运行, 3.解决办法 安装glibc2.34库, …...

「苹果安卓」手机搜狗输入法怎么调整字体大小及键盘高度?

手机搜狗输入法怎么调整字体大小及键盘高度? 1、在手机上准备输入文字,调起使用的搜狗输入法手机键盘; 2、点击搜狗输入法键盘左侧的图标,进入更多功能管理; 3、在搜狗输入法更多功能管理内找到定制工具栏&#xff0c…...

【人工智能】神经网络、前向传播、反向传播、梯度下降、局部最小值、多层前馈网络、缓解过拟合的策略

神经网络、前向传播、反向传播 文章目录 神经网络、前向传播、反向传播前向传播反向传播梯度下降局部最小值多层前馈网络表示能力多层前馈网络局限缓解过拟合的策略前向传播是指将输入数据从输入层开始经过一系列的权重矩阵和激活函数的计算后,最终得到输出结果的过程。在前向…...

一个tomcat部署两个服务的server.xml模板

一个服务的文件夹名字叫hospital&#xff0c;一个服务的文件夹叫ROOT&#xff0c;一个tomcat运行两个服务如何配置呢&#xff1f;注意一个appBase为webapps&#xff0c;另一个appBase为webapps1,当然也可以放在一个webappps里面。 <Service name"Catalina">&l…...

CentOS 7安装Docker

文章目录 安装Docker1.CentOS安装Docker1.1.卸载&#xff08;可选&#xff09;1.2.安装docker1.3.启动docker1.4.配置镜像加速 2.CentOS7安装DockerCompose2.1.下载2.2.修改文件权限2.3.Base自动补全命令&#xff1a; 3.Docker镜像仓库3.1下载一个镜像 安装Docker Docker 分为 …...

Nginx前端部署

1. 前端打包 执行如下命令&#xff0c;构建前端代码&#xff0c;构建成功后会在目录dist下生成构建完成的文件&#xff0c;将dist整个文件夹拷贝到服务器中 npm install npm run build dev 2.nginx配置 进入nginx目录/usr/local/nginx/conf&#xff0c;修改nginx.conf文件&a…...

17网商品详情API:使用与数据解析方法

17网是一家知名的电商平台&#xff0c;提供了大量的商品选择。开发者可以通过17网的商品详情API来快速获取和展示商品的详细信息。 17网商品详情API简介 介绍17网商品详情API的作用和目的&#xff0c;解释为何使用该API可以实现丰富的商品详情展示功能。 获取API访问权限 说…...

解决新版 Idea 中 SpringBoot 热部署不生效

标题 依赖中添加 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <opt…...

Node.js: express + MySQL实现修改密码

实现修改密码&#xff0c;本篇文章实现修改密码只考虑以下几个方面&#xff1a; &#xff08;1&#xff09;&#xff0c;获取旧密码 &#xff08;2&#xff09;&#xff0c;获取新密码 &#xff08;3&#xff09;&#xff0c;将获取到的旧密码与数据库中的密码进行比对&#xf…...

ArduPilot之433电传模块集成之H7Dual飞控Rx/Tx丝印问题

ArduPilot之433电传模块集成之H7Dual飞控Rx/Tx丝印问题 1. 源由2. 安装3. 排查3.1 电气连接3.2 软件配置3.3 模块测试3.4 通信测试3.5 定位问题 4. 总结5. 参考资料 1. 源由 鉴于最近iNav最新固件6.1.1出现远航炸机&#xff0c;还是回到相对可靠的Ardupilot&#xff0c;在Mavl…...

python爬虫优化手段

当使用Python进行网络资源爬取时&#xff0c;会涉及到网络请求、数据处理和存储等操作&#xff0c;这些操作可能会对电脑性能产生一定的影响。以下是一些关于Python爬取网络资源的常见注意事项&#xff1a; 网络请求频率&#xff1a;频繁的网络请求可能会对电脑性能产生较大的影…...

Bootstrap-学习文档

Bootstrap 简介 什么是 Bootstrap&#xff1f; Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架。 Bootstrap是前端开发中比较受欢迎的框架&#xff0c;简洁且灵活。它基于HTML、CSS和JavaScript&#xff0c;HTML定义页面元素&#xff0c;CSS定义页面布局&#x…...

【图像分类】CNN + Transformer 结合系列.1

介绍三篇结合使用CNNTransformer进行学习的论文&#xff1a;CvT&#xff08;ICCV2021&#xff09;&#xff0c;Mobile-Former&#xff08;CVPR2022&#xff09;&#xff0c;SegNetr&#xff08;arXiv2307&#xff09;. CvT: Introducing Convolutions to Vision Transformers, …...

Stable Diffusion - 扩展 SegmentAnything 和 GroundingDINO 实例分割算法 插件的配置与使用

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131918652 Paper and GitHub&#xff1a; Segment Anything: SAM - Segment Anything GitHub: https://github.com/facebookresearch/s…...

自然语言处理从入门到应用——LangChain:提示(Prompts)-[基础知识]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 模型编程的新方法是使用提示&#xff08;Prompts&#xff09;。提示指的是模型的输入。这个输入通常由多个组件构成。PromptTemplate负责构建这个输入&#xff0c;LangChain提供了多个类和函数&#xff0c;使得构建和处…...

Elasticsearch-增删改查数据工作原理

集群 集群的基本概念&#xff1a; 集群&#xff1a;ES 集群由一个或多个 Elasticsearch 节点组成&#xff0c;每个节点配置相同的 cluster.name 即可加入集群&#xff0c;默认值为 “elasticsearch”。节点&#xff1a;一个 Elasticsearch 服务启动实例就是一个节点&#xff…...

IO进、线程——守护进程

守护进程 守护进程的创建过程 1、创建子进程&#xff0c;并退出父进程&#xff1a; 守护进程的创建通常通过fork()系统调用实现。fork()会创建一个新的子进程&#xff0c;该子进程是调用进程&#xff08;父进程&#xff09;的副本。父进程会继续执行fork()之后的代码&#x…...

AXOrderBook:解密A股订单簿重建与FPGA硬件加速的深度技术方案

AXOrderBook&#xff1a;解密A股订单簿重建与FPGA硬件加速的深度技术方案 【免费下载链接】AXOrderBook A股订单簿工具&#xff0c;使用逐笔行情进行订单簿重建、千档快照发布、各档委托队列展示等&#xff0c;包括python模型和FPGA HLS实现。 项目地址: https://gitcode.com…...

Qt6 + OpenGL 3.3 渲染环境搭建全指南:从空白窗口到专属渲染画布的优雅实现

✨ Qt6 OpenGL 3.3 渲染环境搭建全指南&#xff1a;从空白窗口到专属渲染画布的优雅实现&#x1f4cc; 前置环境准备&#x1f527; 第一步&#xff1a;创建Qt Widget Application 工程&#x1f3a8; 第二步&#xff1a;界面元素搭建与QSS样式美化2.1 核心界面元素搭建2.2 QSS样…...

破解招聘时间盲区:Boss Show Time插件如何重构你的求职效率

破解招聘时间盲区&#xff1a;Boss Show Time插件如何重构你的求职效率 【免费下载链接】boss-show-time 展示boss直聘岗位的发布时间 项目地址: https://gitcode.com/GitHub_Trending/bo/boss-show-time 问题发现&#xff1a;招聘信息的时间陷阱 现代求职者每天面临着…...

技术人终身学习:2026年软件测试从业者必跟的5个播客

在技术迭代日新月异的今天&#xff0c;终身学习已不再是可选项&#xff0c;而是软件测试从业者保持竞争力的生存法则。碎片化的时间如何转化为系统性的认知升级&#xff1f;深度思考如何突破日常工作环境的局限&#xff1f;播客&#xff0c;以其伴随性强、信息密度高、视角多元…...

小程序对商家私域运营到底有多重要?

小程序对商家私域运营到底有多重要&#xff1f;在企业持续获取客户成本不断上升的背景下&#xff0c;越来越多商家开始关注“私域运营”&#xff0c;而小程序也逐渐成为这一体系中的核心工具。小程序对商家私域运营的重要性&#xff0c;本质上体现在“用户沉淀能力与转化效率的…...

鸿蒙应用开发实战:手把手教你封装一个可复用的音乐播放器管理类(ArkTS版)

鸿蒙应用开发实战&#xff1a;构建高可复用的音乐播放器管理类&#xff08;ArkTS版&#xff09; 在鸿蒙应用开发中&#xff0c;音频播放功能是许多应用的核心需求。本文将深入探讨如何设计一个健壮、可复用的音乐播放器管理类&#xff0c;采用ArkTS语言实现&#xff0c;帮助开发…...

Qwen3.5-2B部署实操:CentOS 7兼容性处理与依赖库降级方案

Qwen3.5-2B部署实操&#xff1a;CentOS 7兼容性处理与依赖库降级方案 1. 模型简介 Qwen3.5-2B是阿里云推出的轻量化多模态基础模型&#xff0c;属于Qwen3.5系列的小参数版本&#xff08;20亿参数&#xff09;。该模型主打低功耗、低门槛部署特性&#xff0c;特别适配端侧和边…...

深入解析STM32与FreeRTOS内存管理:从理论到实践的最佳配置策略

1. STM32内存结构深度剖析 第一次接触STM32内存管理时&#xff0c;我也被那些专业术语搞得晕头转向。直到把开发板跑死机十几次后&#xff0c;才真正理解RAM和Flash的区别。简单来说&#xff0c;RAM就像你的办公桌面&#xff0c;随时可以读写但断电就清空&#xff1b;Flash则是…...

霞鹜文楷GB:开源楷体字体的国标规范解决方案

霞鹜文楷GB&#xff1a;开源楷体字体的国标规范解决方案 【免费下载链接】LxgwWenkaiGB An open-source Simplified Chinese font derived from Klee One. 项目地址: https://gitcode.com/gh_mirrors/lx/LxgwWenkaiGB 在数字时代的中文排版领域&#xff0c;如何在保持视…...

5个核心功能让网盘用户彻底解决下载速度慢的问题

5个核心功能让网盘用户彻底解决下载速度慢的问题 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / 迅雷云盘 …...