Python编码系列—Python访问者模式:为对象结构添加新功能的艺术

news2024/11/26 17:26:22

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中一起航行,共同成长,探索技术的无限可能。

🚀 探索专栏:学步_技术的首页 —— 持续学习,不断进步,让学习成为我们共同的习惯,让总结成为我们前进的动力。

🔍 技术导航:

  • 人工智能:深入探讨人工智能领域核心技术。
  • 自动驾驶:分享自动驾驶领域核心技术和实战经验。
  • 环境配置:分享Linux环境下相关技术领域环境配置所遇到的问题解决经验。
  • 图像生成:分享图像生成领域核心技术和实战经验。
  • 虚拟现实技术:分享虚拟现实技术领域核心技术和实战经验。

🌈 非常期待在这个数字世界里与您相遇,一起学习、探讨、成长。不要忘了订阅本专栏,让我们的技术之旅不再孤单!

💖💖💖 ✨✨ 欢迎关注和订阅,一起开启技术探索之旅! ✨✨

文章目录

  • 1. 背景介绍
  • 2. 原理
  • 3. 使用场景
  • 4. 代码样例
  • 5. 实际应用案例
  • 6. 总结

1. 背景介绍

在软件开发中,我们经常需要对一个对象结构添加新的操作,同时又希望避免修改现有的对象结构。访问者模式(Visitor Pattern)提供了一种优雅的方式来实现这一需求,它允许你在不改变对象结构的前提下,为对象添加新的功能。本文将深入探讨Python中的访问者模式,包括其背景、原理、使用场景、代码实现和实际应用案例。

访问者模式是一种行为型设计模式,它允许一个或者多个操作应用到一组对象上。模式通过分离操作和对象结构,可以独立地对结构中的元素施加操作,而无需修改元素的类。
在这里插入图片描述

2. 原理

访问者模式的核心原理包括:

  • 定义访问者接口:定义对每个元素类进行操作的接口。
  • 实现具体访问者:实现访问者接口,为每种元素类提供具体的操作实现。
  • 定义元素接口:定义一个元素接口,每个元素类都包含一个接受访问者的接口。
  • 实现具体元素:实现元素接口,提供接受访问者方法的实现。
  • 对象结构:定义一个能够枚举元素并提供给访问者的结构。

访问者模式通过分离数据结构和操作的方式,提供了一种强大的方式来扩展系统功能。下面详细探讨访问者模式的核心原理:

定义访问者接口
访问者接口定义了对每种类型的元素执行操作的方法。这些方法与元素接口中定义的元素类型一一对应。访问者接口的设计允许新的访问者能够对元素进行特定的操作,而无需修改元素类。

class Visitor(ABC):
    @abstractmethod
    def visit_element_a(self, element):
        pass

    @abstractmethod
    def visit_element_b(self, element):
        pass

在这个例子中,Visitor接口定义了对ElementAElementB的访问操作。

实现具体访问者
具体访问者实现了访问者接口中定义的方法,提供了对每种元素进行操作的具体实现。具体访问者包含算法和执行操作所需的逻辑。

class ConcreteVisitorA(Visitor):
    def visit_element_a(self, element):
        print(f"ConcreteVisitorA visiting ElementA")

    def visit_element_b(self, element):
        print(f"ConcreteVisitorA visiting ElementB")

class ConcreteVisitorB(Visitor):
    def visit_element_a(self, element):
        print(f"ConcreteVisitorB visiting ElementA")

    def visit_element_b(self, element):
        print(f"ConcreteVisitorB visiting ElementB")

定义元素接口
元素接口定义了一个accept方法,该方法接受一个访问者对象作为参数。元素接口为访问者提供了一个访问元素的入口。

class Element(ABC):
    @abstractmethod
    def accept(self, visitor):
        pass

实现具体元素
具体元素实现了元素接口的accept方法,通常包含一个对访问者的调用,这样访问者就可以对元素执行操作。

class ConcreteElementA(Element):
    def accept(self, visitor):
        visitor.visit_element_a(self)

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

对象结构
对象结构是一个复杂且多态的元素集合,它提供了一个方法来允许访问者访问其元素。对象结构可以是一个复合对象,也可以是元素的集合。

class ObjectStructure:
    def __init__(self):
        self.elements = []

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

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

在这个例子中,ObjectStructure类管理了一个元素列表,并提供了accept方法,允许访问者遍历每个元素。

通过这些核心原理,访问者模式允许你将算法和对象结构分离,从而在不修改对象结构的情况下引入新的操作和算法。这种模式在处理复杂的对象结构和需要动态添加操作的场景中非常有用。

3. 使用场景

访问者模式适用于以下场景:

  • 需要对对象结构中的对象进行很多不同的操作:而这些操作难以在不改变结构的前提下实现。
  • 对象结构稳定,但经常需要在此结构上添加新的操作

4. 代码样例

以下是一个Python中实现访问者模式的示例:

from abc import ABC, abstractmethod

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

# 实现具体元素
class ConcreteElementA(Element):
    def accept(self, visitor):
        visitor.visit(self)

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

# 定义访问者接口
class Visitor(ABC):
    @abstractmethod
    def visit(self, element):
        pass

# 实现具体访问者
class ConcreteVisitorA(Visitor):
    def visit(self, element):
        print(f"Visitor A visit {element}")

class ConcreteVisitorB(Visitor):
    def visit(self, element):
        print(f"Visitor B visit {element}")

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

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

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

# 客户端代码
if __name__ == "__main__":
    structure = ObjectStructure()
    structure.add(ConcreteElementA())
    structure.add(ConcreteElementB())

    visitor_a = ConcreteVisitorA()
    visitor_b = ConcreteVisitorB()

    structure.accept(visitor_a)
    structure.accept(visitor_b)

5. 实际应用案例

假设我们正在开发一个文档编辑器,需要对文档中的不同元素(如段落、列表)应用不同的文本处理操作。我们可以使用访问者模式来实现这一需求。

class DocumentElement(Element):
    def __init__(self, content):
        self.content = content

    def accept(self, visitor):
        visitor.visit(self)

class Paragraph(DocumentElement):
    pass

class ListElement(DocumentElement):
    pass

class TextProcessor(Visitor):
    def visit(self, element):
        print(f"Processing text in {type(element).__name__}: {element.content}")

# 客户端代码
if __name__ == "__main__":
    paragraph = Paragraph("Hello, World!")
    list_item = ListElement("Item 1")

    structure = ObjectStructure()
    structure.add(paragraph)
    structure.add(list_item)

    processor = TextProcessor()
    structure.accept(processor)

6. 总结

访问者模式是一种非常实用的设计模式,它通过分离操作和对象结构,允许你在不改变对象结构的前提下,为对象添加新的功能。这种模式在处理需要对多种类型的对象执行操作的场景中非常有用。

设计模式是软件设计中的艺术,访问者模式作为其中的一种,为我们提供了一种优雅的方式来扩展对象结构的功能。希望本文能够帮助你在Python项目中更好地应用访问者模式,提升代码的质量和灵活性。

🌟 在这篇博文的旅程中,感谢您的陪伴与阅读。如果内容对您有所启发或帮助,请不要吝啬您的点赞 👍🏻,这是对我最大的鼓励和支持。

📚 本人虽致力于提供准确且深入的技术分享,但学识有限,难免会有疏漏之处。如有不足或错误,恳请各位业界同仁在评论区留下宝贵意见,您的批评指正是我不断进步的动力!😄😄😄

💖💖💖 如果您发现这篇博文对您的研究或工作有所裨益,请不吝点赞、收藏,或分享给更多需要的朋友,让知识的力量传播得更远。

🔥🔥🔥 “Stay Hungry, Stay Foolish” —— 求知的道路永无止境,让我们保持渴望与初心,面对挑战,勇往直前。无论前路多么漫长,只要我们坚持不懈,终将抵达目的地。🌙🌙🌙

👋🏻 在此,我也邀请您加入我的技术交流社区,共同探讨、学习和成长。让我们携手并进,共创辉煌!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2190178.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LLM端侧部署系列 | PowerInfer-2助力AI手机端侧部署47B大模型 (论文解读)

引言 简介 PowerInfer-2 概述 神经元感知的运行时推理 多态神经元引擎 内存中的神经元缓存 灵活的神经元加载 Neuron-Cluster-Level Pipeline 生成执行计划 执行 总结 0. 引言 一雨池塘水面平,淡磨明镜照檐楹。东风忽起垂杨舞,更作荷心万点声…

2024年liunx安装openvino非源码编译版(比源码编译简单!)

前言 真的要感慨一句,openvino源码编译真的麻烦!由于2023年之后openvino官网的之间下载取消之后,很多人只能选择源码编译,我也是研究了好几天,又是clone改变的库,又是安装什么,搞了三四天都没有…

已解决:TypeError: ‘int‘ object is not iterable

已解决:TypeError: ‘int’ object is not iterable 文章目录 写在前面问题描述报错原因分析 解决思路解决办法1. 检查代码中的 for 循环2. 检查函数返回值是否为可迭代对象3. 确认变量类型4. 使用 map() 或 list comprehension 处理整数5. 防止不必要的迭代 总结 写…

Leetcode—148. 排序链表【中等】

2024每日刷题(171) Leetcode—148. 排序链表 C实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr…

java计算机毕设课设—坦克大战游戏

这是什么系统? 坦克大战游戏是一款以坦克为主题的射击游戏,旨在为玩家提供一个刺激、有趣的游戏体验。该游戏不仅拥有丰富的功能,还注重玩家的互动体验。此系统是使用Java语言实现坦克大战游戏程序,玩家通过连接访问进入游戏&…

【C++】—— 类和对象(上)

【C】—— 类和对象(上) 文章目录 【C】—— 类和对象(上)前言1. 类的定义1.1 类定义格式1.2 访问限定符1.3 类域 2. 实例化2.1 实例化概念2.2 对象的大小 3. this指针4. C和C语言实现Stack对比结语 前言 小伙伴们大家好呀,今天我们就开始学习C的重点及难点——类和…

[python]Flask_Login

flask_login是flask框架中的一个拓展功能,用于更快捷的实现用户会话管理功能,主要处理登录,注销和长时间会话存储的功能处理。 目录 安装 使用 第一步,配置SECRET_KEY 第二步,创建LoginManager实例绑定app 第三步,用户类继承UserMixin …

Github优质项目推荐-第三期

文章目录 Github优质项目推荐 - 第三期一、【coding-interview-university】,305k stars - 软件工程师学习计划二、【drawdb】,20.1k stars - 数据库设计工具三、【twenty】,16k stars - 排名第一的开源 CRM四、【Douyin-Vue】,9.…

海南网站建设提升网站用户体验实用技巧

海南网站建设提升网站用户体验实用技巧 在当今数字时代,网站已成为企业展示形象和吸引客户的重要平台。尤其对于海南这一旅游胜地来说,优化网站用户体验显得尤为重要。以下是一些实用技巧,可帮助您提升网站的用户体验。 首先,确保…

柔性作业车间调度(FJSP)

1.1 调度问题的研究背景 生产调度是指针对一项可分解的工作(如产品制造),在尽可能满足工艺路线、资源情况、交货期等约束条件的前提下,通过下达生产指令,安排其组成部分(操作)所使用的资源、加工时间及加工的先后顺序,以获得产品制造时间或成本最优化的一项工作。 一般研究车间…

django的路由分发

前言: 在前面我们已经学习了基础的Django了,今天我们将继续学习,我们今天学习的是路由分发: 路由分发是Web框架中的一个核心概念,它指的是将不同的URL请求映射到对应的处理函数(视图)的过程。…

发现一篇瑞芯微RK3588上使用Gstreamer的文章(野火)

1. 前言 最近经常使用英伟达的Orin和瑞芯微RK3588做开发,自己还买了好几块开发板,很多需要自己琢磨,今天忽然发现了一篇文章,意外解决了一些之前的问题,以此作为记录: 文章链接:https://doc.embedfire.com/linux/rk356x/quick_start/zh/latest/lubancat_rk_software_har…

Redis基础三(redis的高级配置)

Redis进阶配置 一、Redis持久化操作 ​ 持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。(Redis 数据都放在内存中。如果机器挂掉,内存的数据就不存在。所以需要做持久化,将内存中的数据保存在磁盘&#xff0c…

Gralloc图形缓冲的分配过程

广告 首先帮我朋友打个广告 我们一起在运营一个视频号 感兴趣的可以帮忙点击右边这个小铃铛 铃铛 序 其实越往底下走在很多人嘴里就会变得很玄乎,变得不可思议,这里的gralloc就是一个native service,只是分装了一些调用接口,上…

使用Scikit-image进行图像处理入门

简介 在数据科学的广阔领域中,图像处理占据了重要的一席之地,为分析和处理视觉数据提供了各种工具和技术。Python 拥有丰富的库生态系统,为图像处理提供了多种选择,其中,scikit-image 凭借其强大且易用的功能脱颖而出…

记录使用gym和stable_baseline3训练出成功通关的贪吃蛇ai

参考自b站up林亦LYi的开源项目 传送门 本次只训练了cnn版本的 第一次接触这种项目,建python虚拟环境时出了点难以说清楚的小问题,安装不上requirement.txt中的gym库那个版本,折腾了一会,自己都乱了头绪,最后导致训练…

TMGM:黄金价格持稳,而WTI原油价格和天然气价格飙升

黄金价格顽强地拒绝下跌,昨天和周三继续抵制下行的趋势。 价格继续保持在近期的历史高位附近,很可能会有进一步上涨的动力。美元走强阻止了价格的进一步上涨,但总体上升趋势仍在进行中。 目前还没有明显的向下催化剂迹象,不过如…

c++联合体

// // Created by 徐昌真 on 2024/10/5. // #include <iostream> using namespace std;//定义一个结构体 struct DataS{ //内存空间独立int a;double b;char c[10]; };//定义一个联合体 union DataU{ //内存空间在一起int a;double b;char c[10]; };int main() {//创建…

Pikachu-目录遍历

目录遍历&#xff0c;跟不安全文件上传下载有差不多&#xff1b; 访问 jarheads.php 、truman.php 都是通过 get 请求&#xff0c;往title 参数传参&#xff1b; 在后台&#xff0c;可以看到 jarheads.php 、truman.php所在目录&#xff1a; /var/www/html/vul/dir/soup 图片…

奥博思软件总经理刘玉军受邀为项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 北京奥博思软件技术有限公司联合创始人、总经理刘玉军先生受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“高效协作的秘密&#xff1a;项目管理平台助力跨部门协作”。大会将于…