Python 如何实现访问者设计模式?什么是访问者(Visitor)模式?实际案例中有什么作用?

深入浅出Python中的访问者模式及其应用场景 在面向对象设计中,访问者模式是一种行为设计模式,它主要用于在不改变现有类结构的前提下,为对象的元素结构增加新的操作。简单来说,访问者模式就像是一位“检查员”,它可以对不同类型的元素进行特定的访问和操作。这种模式将数据结构与作用于结构上的操作解耦合,使得操作集合可以独立变化。Visitor(访问者):定义一个接口,用于声明对每一个元素类的操作方法。ConcreteVisitor(具体访问者):实现了 Visitor 接口,为每个元素类提供了具体的访问操作实现。Element(元素):声明接受访问者的。 阅读详情

什么是访问者设计模式?访问者(Visitor)设计模式介绍:

访问者(Visitor)设计模式是一种行为设计模式,用于在不修改被访问对象的前提下定义新的操作。它通过将操作封装到独立的访问者类中,实现了将数据结构与操作解耦的目标。这种模式适用于对复杂对象结构进行操作的场景,特别是当对象结构包含多个类型的对象,并且这些对象类型可能会发生变化。

在这里插入图片描述

主要角色:

  1. 访问者接口(Visitor): 定义了访问者类的接口,声明了可以访问哪些元素。

  2. 具体访问者类(ConcreteVisitor): 实现了访问者接口,提供了对每个元素进行操作的具体实现。

  3. 元素接口(Element): 定义了对象结构中的元素的接口,声明了接受访问者的方法。

  4. 具体元素类(ConcreteElement): 实现了元素接口,提供了接受访问者的具体实现。

  5. 对象结构类(ObjectStructure): 包含了多个元素,提供了一个接受访问者的方法,使访问者能够访问结构中的所有元素。

工作流程:

  1. 定义访问者接口,声明访问每种元素的方法。

  2. 实现具体访问者类,为每种元素提供具体的访问操作。

  3. 定义元素接口,声明接受访问者的方法。

  4. 实现具体元素类,提供接受访问者的具体实现。

  5. 定义对象结构类,包含多个元素,提供接受访问者的方法。

  6. 客户端创建访问者对象和对象结构对象,并通过对象结构的接受方法调用访问者的操作。

优点:

  • 分离关注点: 将数据结构与操作解耦,使得可以独立扩展两者之一而不影响另一方。

  • 新增操作方便: 可以轻松地新增对元素的操作,而无需修改元素本身。

  • 适用于复杂结构: 对于包含多个类型对象的复杂结构,访问者模式能更好地组织和管理操作。

Python 实现访问者模式示例代码(一):

from abc import ABC, abstractmethod

# 访问者接口
class Visitor(ABC):
    @abstractmethod
    def visit_element_a(self, element_a):
        pass

    @abstractmethod
    def visit_element_b(self, element_b):
        pass

# 具体访问者类
class ConcreteVisitor(Visitor):
    def visit_element_a(self, element_a):
        print(f"Visiting Element A: {element_a.operation_a()}")

    def visit_element_b(self, element_b):
        print(f"Visiting Element B: {element_b.operation_b()}")

# 元素接口
class Element(ABC):
    @abstractmethod
    def accept(self, visitor):
        pass

# 具体元素类
class ConcreteElementA(Element):
    def accept(self, visitor):
        visitor.visit_element_a(self)

    def operation_a(self):
        return "Operation A"

class ConcreteElementB(Element):
    def accept(self, visitor):
        visitor.visit_element_b(self)

    def operation_b(self):
        return "Operation B"

# 对象结构类
class ObjectStructure:
    def __init__(self):
        self.elements = []

    def add_element(self, element):
        self.elements.append(element)

    def accept(self, visitor):
        for element in self.elements:
            element.accept(visitor)

# 客户端
visitor = ConcreteVisitor()
element_a = ConcreteElementA()
element_b = ConcreteElementB()

object_structure = ObjectStructure()
object_structure.add_element(element_a)
object_structure.add_element(element_b)

object_structure.accept(visitor)

这个示例演示了访问者设计模式在 Python 中的应用。通过定义访问者接口、具体访问者类、元素接口、具体元素类和对象结构类,实现了对元素的访问操作。


Python 实现访问者模式示例代码(二)

假设我们有一个电商网站,有不同类型的商品,例如电子产品、服装和图书。我们希望实现一个价格计算器,根据不同类型的商品和用户等级计算最终价格。这个场景可以使用访问者设计模式。

from abc import ABC, abstractmethod

# 访问者接口
class PriceCalculatorVisitor(ABC):
    @abstractmethod
    def visit_electronic_product(self, electronic_product):
        pass

    @abstractmethod
    def visit_clothing(self, clothing):
        pass

    @abstractmethod
    def visit_book(self, book):
        pass

# 具体访问者类
class StandardPriceCalculator(PriceCalculatorVisitor):
    def visit_electronic_product(self, electronic_product):
        return electronic_product.base_price

    def visit_clothing(self, clothing):
        return clothing.base_price * 0.9  # 服装打九折

    def visit_book(self, book):
        return book.base_price * 0.8  # 图书打八折

# 元素接口
class Product(ABC):
    @abstractmethod
    def accept(self, visitor):
        pass

# 具体元素类
class ElectronicProduct(Product):
    def __init__(self, base_price):
        self.base_price = base_price

    def accept(self, visitor):
        return visitor.visit_electronic_product(self)

class Clothing(Product):
    def __init__(self, base_price):
        self.base_price = base_price

    def accept(self, visitor):
        return visitor.visit_clothing(self)

class Book(Product):
    def __init__(self, base_price):
        self.base_price = base_price

    def accept(self, visitor):
        return visitor.visit_book(self)

# 对象结构类
class ShoppingCart:
    def __init__(self):
        self.products = []

    def add_product(self, product):
        self.products.append(product)

    def calculate_total_price(self, visitor):
        total_price = 0
        for product in self.products:
            total_price += product.accept(visitor)
        return total_price

# 客户端
electronic_product = ElectronicProduct(base_price=100)
clothing = Clothing(base_price=50)
book = Book(base_price=30)

shopping_cart = ShoppingCart()
shopping_cart.add_product(electronic_product)
shopping_cart.add_product(clothing)
shopping_cart.add_product(book)

standard_price_calculator = StandardPriceCalculator()
total_price = shopping_cart.calculate_total_price(standard_price_calculator)

print(f"Total Price: ${total_price}")

在这个示例中,PriceCalculatorVisitor 是访问者接口,定义了不同类型商品的价格计算方法。StandardPriceCalculator 是具体访问者类,实现了实际的价格计算逻辑。Product 是元素接口,定义了接受访问者的方法。ElectronicProduct、Clothing 和 Book 是具体元素类,分别代表不同类型的商品。ShoppingCart 是对象结构类,包含了多个商品,提供了计算总价格的方法。

在客户端,我们创建了一些商品并放入购物车,然后使用访问者模式计算总价格。这个例子展示了访问者设计模式在实际开发中的应用,如何有效地对不同类型的对象进行操作。


使用访问者模式时,需要注意哪些问题?

使用访问者设计模式时,需要注意一些问题,以确保模式的有效实施和代码的可维护性:

  1. 新元素的添加: 如果系统中新增了新的元素类型,需要修改所有的具体访问者类,为新增元素类型添加相应的访问方法。这可能导致修改多个类,违反了开闭原则。

  2. 元素接口修改: 如果元素接口发生变化,所有的具体元素类都需要进行相应的修改。这可能导致修改多个类,破坏了系统的稳定性。

  3. 违反封装: 访问者模式在一定程度上打破了元素的封装性,因为具体访问者类需要访问元素的内部状态。这可能使得元素的内部结构对外部可见,降低了封装性。

  4. 复杂性: 访问者模式引入了多个接口和类,增加了系统的复杂性。对于简单的对象结构,使用访问者模式可能过于繁琐。

  5. 理解困难: 对于不熟悉访问者模式的开发人员,理解其运作机制可能需要一些时间。在团队中使用该模式时,确保团队成员对其有足够的了解是重要的。

  6. 性能开销: 访问者模式可能引入一定的性能开销,特别是当对象结构较大且变动频繁时。在性能敏感的应用中,需要仔细评估使用访问者模式的代价。

  7. 使用场景限制: 访问者模式更适合于对象结构相对稳定且具有多种不同类型元素的情况。如果对象结构变动频繁,或者元素类型较少,可能没有必要引入访问者模式。

虽然访问者模式有一些潜在的问题,但在某些场景下,它仍然是一个强大的设计模式,能够有效地处理复杂的对象结构。在使用时,需要仔细考虑系统的特定需求和约束。


本文就到这里了,感谢您的阅读 。别忘了点赞、收藏~ Thanks♪(・ω・)ノ 🍇

Python 设计模式—访问者模式 今日分享主题:Python 设计模式之访问者模式。 定义 访问者模式是指封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义于作用于这些元素的新操作。 应用场景 1、要遍历不同的对象,根据对象进行不同的操作的场景; 2、当一个对象被多个不同对象顺次处理的情况,可以考虑使用访问者模式; 3、报表生成器也可以使用访问者模式实现,报表的数据源由多个不同的对象提供,每个对象都是Visitor,报表这个Element顺次Accept各访问者完善并生成对象。 Python.. 阅读详情

相关推荐

访问者模式(Visitor Pattern)

✅ 将操作封装到独立的访问者类中,避免修改原有类结构,符合开闭原则。✅ 适用于需要在一个不常变化的对象结构上,动态增加新操作的场景。如果你对访问者模式有其他问题或想了解更多细节,欢迎继续提问!

qq_42889517的博客 1061

Python访问者模式介绍、使用

访问者模式(Visitor Pattern)是一种行为型设计模式,它能够将算法与对象结构分离,使得算法可以独立于对象结构而变化。这个模式的主要思想是,将对象结构和算法分离开来,使得算法可以独立于对象结构而变化。该模式的核心概念是,定义一个访问者对象,它是对某个对象结构中各个元素的操作,这种操作可以改变元素的类或状态。访问者模式的主要功能是,提供一个统一的访问接口,使得访问者能够遍历整个对象结构,对各个元素进行操作。优点:1、访问者模式可以将数据结构与算法分离,增强了代码的可扩展性和可维护性。

captain 808

设计模式 — 行为型模式 — 访问者模式

目录 文章目录目录访问者模式(Visitor Pattern)应用场景代码示例 访问者模式(Visitor Pattern) 数据结构中保存着许多元素,当我们希望改变一种对元素的处理方式时,要避免重复的修改数据结构。那么就要求我们在实现代码时,将数据的处理进行分离,即:数据类只提供一个数据处理的接口,而该数据处理接口就被称之为访问者。那么,相同结构的数据面临不同的处理结果时,我们只需要创建不同的访问者。 访问者模式,指作用于一个对象结构体上的元素的操作。访问者可以使用户在不改变该结构体中的类的基础上定义一个

烟云的计算 1470

【Python设计模式26】访问者模式

passpass")")pass访问者模式是一种行为型设计模式,通过将数据结构与作用于结构上的操作解耦,使得增加新的操作变得容易。访问者模式适用于对象结构稳定而操作多变、需要对对象结构中的对象进行不同操作以及需要将无关行为分离到不同类中的场景。合理应用访问者模式,可以提高系统的灵活性和可维护性。理解并掌握访问者模式,有助于在实际开发中构建高效、灵活的系统。

weixin_55252589的博客 702

设计模式 访问者模式

最简单的访问者模式讲解代码,设计模式可看看博客中简介http://blog.sina.com.cn/s/blog_161d504630102wxis.html

轻松掌握python设计模式之访问者模式

主要帮助大家轻松掌握python设计模式之访问者模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Python设计模式详解之23 —— 访问者模式

Visitor 模式通过将操作封装到访问者中,解耦了操作逻辑与数据结构,使得可以轻松扩展操作逻辑。然而,它也增加了系统的复杂性,适用于操作频繁变化而数据结构稳定的场景。Python 的动态特性也为 Visitor 模式的实现提供了更多的灵活性,例如通过反射或动态方法调用简化双重分派的实现

拾工 896

浮栅晶体管原理深度解析:热电子注入与FN隧穿如何实现1/0存储

本文深入解析了浮栅晶体管的工作原理,重点探讨了热电子注入与FN隧穿机制如何实现1/0存储。作为现代闪存芯片的核心技术,浮栅晶体管通过独特的结构设计实现非易失性存储,文章详细分析了其编程与擦除的物理过程,并对比了两种机制的优缺点,为闪存性能优化提供了理论基础。

weixin_30363285的博客 372

【设计模式】【行为型模式(Behavioral Patterns)】之访问者模式(Visitor Pattern)

访问者模式是一种行为设计模式,它允许您在不修改现有元素类层次结构的情况下向其添加新的操作。这种模式通过将算法从对象结构中分离出来,使得添加新的操作变得容易,同时保持了原有的对象结构不变。

ido1ok的博客 1051

高杂合度基因组组装实战:Hifiasm参数调优与purge_dups过滤效果对比(附猪毛菜案例)

本文深入探讨了高杂合度基因组组装中Hifiasm参数调优与purge_dups过滤的实战效果对比,通过猪毛菜案例详细解析了两种方法的适用场景与优化策略。文章重点分析了purge_dups在contig过滤中的显著效果,为基因组组装提供了关键的技术参考。

weixin_29232121的博客 495

手把手教你用VMware虚拟机搭建PCAN开发环境:从Ubuntu安装到CAN通讯实战

本文详细指导如何在VMware虚拟机中搭建PCAN开发环境,涵盖从Ubuntu系统安装、VMware精细配置、PCAN-USB设备直通,到Linux驱动编译、can-utils工具集使用及完整CAN通讯测试的全过程。通过实战步骤与故障排查技巧,帮助开发者快速构建稳定高效的CAN总线开发与测试沙盒,特别适合车载诊断与嵌入式通讯应用。

weixin_29216353的博客 221

行为型设计模式-访问者(visitor)模式

访问者模式通过将操作逻辑封装在访问者对象中,允许对对象结构中的元素执行操作而无需修改这些元素类。这使得添加新的操作变得简单,同时也保持了元素类的稳定性。适用于那些需要对对象结构。

linkedin_21843693的博客 875

海思芯片YOLOv8模型部署完整指南:从RPN硬化到8bit量化精度优化

本文详细介绍了在海思芯片平台部署YOLOv8目标检测模型的完整方案,重点解决8bit量化精度损失问题。通过分析海思RPN硬化层的性能优势(1.9ms推理时间),对比不同量化策略(16bit仅损失0.6AP,8bit损失5.2AP),并深入定位到strides计算层是量化误差的主要来源。关键突破在于采用混合精度策略(敏感层16bit,其余8bit),使8bit量化AP回升4.1%,同时保持3.4ms的推理速度和60%的低NPU占用率。文章还提供了量化参数调整、校准数据集优化等进阶技巧,为边缘计算应用提供了性能

FJN110的博客 731

大话设计模式:第28章 访问者模式

第28章:访问者模式 访问者模式 访问者模式(visitor):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 Visitor类:为该对象结构中ConcreteElement的每一个类声明一个Visit操作。 ConcreteVisitor1和ConcreteVisitor2类:具体访问者,实现每个由Visitor声明的操作。每个操作实现算法的一部分,而该算法片断乃是对应于结构中对象的类。 Element类:定义一个Accept操作,它

Always On The Way 310

嵌入式铁头山羊stm32:一文总结

本文是一篇STM32嵌入式开发的综合知识总结,涵盖了STM32基础概念、GPIO、通信协议、外设驱动等核心内容。文章首先介绍了STM32的基本概念和型号含义,然后详细讲解了GPIO的8种工作模式及实验案例。接着重点阐述了USART、I2C、SPI三种通信协议的原理和实现方法,包括硬件连接、编程接口和实验应用。此外还介绍了OLED显示原理、中断系统、定时器、ADC转换等关键技术,每个模块都配有对应的实验案例和代码实现参考。文章内容全面系统,既包含理论知识,又提供实践指导,适合作为STM32开发的快速参考手册。

古泽汉书的博客 2777

用 SE84 反查 SAP 消息号:弹窗一闪而过也能抓到 Message ID 和 Number 的小技巧

SAP开发技巧:通过消息文本反查Message ID和编号 在SAP开发中,经常遇到系统只显示错误消息文本而缺少技术信息的情况。本文介绍两种实用方法: 使用SE84工具:通过输入带通配符的短文本(如"错误文本")反向查找消息类和编号 直接查询T100表:利用消息文本在T100表中检索完整的消息技术信息 这些技巧特别适用于处理弹窗消息、框架层错误等无法直接获取技术细节的场景。掌握消息ID和编号后,开发者可以更高效地进行问题定位、代码调试和错误处理,尤其在SAP Gateway、RAP等现代

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 370

【鲁班学院】设计模式—访问者(Visitor)模式

一、定义 访问者模式是一种从操作的对象结构中分离算法的方式。 它可以在不改变数据结构的前提下定义作用与这些元素的新操作。它遵循开闭原则。 Represent an operation to be performed on elements of an object structure. Visitor lets you define a new operation without changin...

weixin_33928137的博客 243

在Centos上从零开始部署并运行TinyWebServer服务器,过程记录(非常详细)

TinyWebServer是个什么项目?它是Linux下C++轻量级Web服务器,助力初学者快速实践网络编程,搭建属于自己的服务器。使用线程池+非阻塞socket+epoll(ET和LT均实现) +事件处理(Reactor和模拟Proactor均实现) 的并发模型使用状态机解析HTTP请求报文,支持解析GET和POST请求访问服务器数据库实现web端用户注册、登录功能,可以请求服务器图片和视频文件实现同步/异步日志系统,记录服务器运行状态。......

AnChenliang_1002的博客 3020

为什么Python不用设计模式?

在遥远的Python王国,有一位少年,非常热爱编程,他的父母想给他报一个班,问了万能的朋友圈以后,发现大家都推荐同一个老师,人称吉先生。于是他的父母毫不犹豫就交了一笔不...

码农翻身 3694

EMC中的RE测试与整改

测试主要测试电子、电气设备或系统在正常工作时自身对外界的辐射干扰强度,包括来自电路板、机箱、电缆及连接线等所有部件的辐射骚扰。分为:磁场辐射和。其中后者较为应用普遍。测试频段根据不同标准要求不一致。手机测试的频段主要为30-1000MHZ。需要注意的是设备在进行RE测试时要求尽可能满配置,满负荷的运行。同时RE也是EMC中的难点。

学海无涯的专栏 1669

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【设计模式】—— 访问者模式Visitor

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33733810的博客 134

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Visitor模式

Visitor模式 Visitor模式作用是表示一个作用于某个对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下 定义作用于这些元素的新操作。 开发时,可能会经常移到需求变更:我们做好的一个设计、实现了一个系统原型,客户又有了新的需求,因此不得不 去更该已有的设计,最常见的解决方案就是给已经设计好的类添加I新的方法去实

yangchuankai's blog 943

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Modern c++ visitor 模式的实现

最近在代码里常常看到访问者模式的代码,自己也实现一下,看看是否对访问者模式有着正确的理解。 有两个元素,不同的的访问者访问的时候,会出现不同的效果,我们可以考虑使用访问者模式来实现 这个例子里,这两个元素是两种编程语言,python和go(PythonLang和GoLang) 访问者也有两种,真正的程序员和虚假的程序员(RealCoder 和 FakeCoder) 真正的程序员学一门语言会认真...

qq_20694641的博客 431

访问者模式(python)

访问者模式:表示一个作用于某对象结构中的各元素的操作。它可以使你在不改变各元素的类的前提下定义作用于这些元素的新操作。 访问者模式适用于数据结构相对稳定而基于该数据结构的操作需要经常扩展的系统。因为该模式的优点就是增加新的操作很容易。 #encoding=utf-8 # #by panda #访问模式 def printInfo(info): print unicode(info,

ponder008的专栏 3061

python设计模式23-访问者模式

访问者模式Visitor Visitor模式是在补修改已有程序结构前提下,通过添加额外的访问者完成对代码功能的拓展。为什么这样用?当你的类层次较多,在某层结构中增加新的方法,要是在基类上面添加或者变更,可能破坏原来的设计,有兼容问题,所以只在需要的类上面动态添加。 这里是个构建车的例子,每个部件都有一个accept的方法接受我上面说的所谓’访问者’,而这个访问者以参数的方式传进来,但是其实他是一个含有一些功能的类的实例,它拥有很多个visit开头的方法对应不同的部件。这样就不需要修改这些部件,而只是修改

rayylee 691

python--设计模式--18--行为型--访问者模式

访问者模式(Visitor Pattern)访问者模式是一种将算法与对象结构分离的设计模式。它的核心思想是:可以在不修改现有类的情况下,为这些类添加新的操作。

Chasing__Dreams的博客 291
上一篇: Python 如何实现 Strategy 策略设计模式?什么是 Strategy 策略设计模式?
下一篇: Python 如何实现迭代器设计模式?什么是迭代器(Iterator)设计模式?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天河书阁 VicRestart

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值