当前位置: 首页 > 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…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...