【python设计模式】23、访问者模式

news/2024/11/25 21:19:28/

哲学思想

访问者模式是一种行为型设计模式,它的哲学思想是将算法从对象结构中分离出来,使得这些算法可以独立地变化和复用。该模式的核心是在不改变对象结构的前提下,定义作用于这些对象的新操作。

简介

访问者模式是一种将算法与对象结构分离的设计模式。它的核心思想是将访问者对象封装算法,然后将它们作用于各个元素对象。访问者模式中的元素对象包括一个元素接口和多个元素类,每个元素类都实现了元素接口,且包含一个 accept() 方法,用于接受访问者对象。访问者对象包括一个访问者接口和多个访问者类,每个访问者类都实现了访问者接口,且包含多个 visit() 方法,用于访问不同的元素类。

当需要为元素对象增加新的操作时,只需要定义一个新的访问者类并实现相应的 visit() 方法即可,而不需要改变元素对象或现有的访问者类。

优点

  1. 将算法与对象结构分离,使得算法可以独立地变化和复用。
  2. 在不改变对象结构的前提下,增加新的操作很容易。
  3. 可以对同一组对象进行不同的操作,而不需要修改对象本身。

缺点

  1. 增加新的元素类比较困难,需要修改所有的访问者类。
  2. 访问者模式需要访问者对象了解所有的元素类,如果元素类的数量非常大,则会导致访问者对象的复杂度增加。

实际应用场景

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

  1. 对象结构比较稳定,但是需要增加新的操作时。
  2. 对象结构中的元素类数量比较小,但是需要对它们进行多种不同的操作时。
  3. 对象结构中的元素类数量非常大,但是需要对它们进行有限的、预定的操作时。

常见的实际应用场景包括:

  1. 编译器的语法分析器和优化器。
  2. 图形界面组件库中的布局和渲染算法。
  3. 企业级应用程序中的数据分析和报表生成。
  4. 游戏开发中的游戏物品和角色的管理和处理。

代码实现:

# 定义元素接口
class Element:def accept(self, visitor):pass# 定义元素类A
class ElementA(Element):def accept(self, visitor):visitor.visit_element_a(self)def operation_a(self):print("执行元素A的操作")# 定义元素类B
class ElementB(Element):def accept(self, visitor):visitor.visit_element_b(self)def operation_b(self):print("执行元素B的操作")# 定义访问者接口
class Visitor:def visit_element_a(self, element):passdef visit_element_b(self, element):pass# 定义访问者类X
class VisitorX(Visitor):def visit_element_a(self, element):print("访问者X正在访问元素A")element.operation_a()def visit_element_b(self, element):print("访问者X正在访问元素B")element.operation_b()# 定义访问者类Y
class VisitorY(Visitor):def visit_element_a(self, element):print("访问者Y正在访问元素A")element.operation_a()def visit_element_b(self, element):print("访问者Y正在访问元素B")element.operation_b()# 创建元素对象
element_a = ElementA()
element_b = ElementB()# 创建访问者对象
visitor_x = VisitorX()
visitor_y = VisitorY()# 对元素对象进行操作
element_a.accept(visitor_x)  # 输出:访问者X正在访问元素A\n执行元素A的操作
element_a.accept(visitor_y)  # 输出:访问者Y正在访问元素A\n执行元素A的操作
element_b.accept(visitor_x)  # 输出:访问者X正在访问元素B\n执行元素B的操作
element_b.accept(visitor_y)  # 输出:访问者Y正在访问元素B\n执行元素B的操作

在上面的示例代码中,我们首先定义了元素接口 Element,并为每个元素类定义了一个 accept() 方法,用于接受访问者对象。然后,我们定义了元素类 ElementAElementB,它们分别实现了元素接口,并在 accept() 方法中调用访问者对象的相应方法。

接下来,我们定义了访问者接口 Visitor,并为每个访问者类定义了一个 visit() 方法,用于访问不同的元素类。在示例代码中,我们定义了两个访问者类 VisitorXVisitorY,它们分别实现了访问者接口,并在 visit() 方法中执行了相应的操作。

最后,我们创建了元素对象和访问者对象,并对元素对象进行操作。在每次操作中,我们将访问者对象传递给元素对象的 accept() 方法,然后由访问者对象来执行相应的操作。

总之,这是一个简单的访问者模式


http://www.ppmy.cn/news/43167.html

相关文章

网络技术领域专业术语解释大全-170个术语

1. 自主访问控制(DAC:Discretionary Access Control) 自主访问控制(DAC)是一个访问控制服务,其执行一个基于系统实体身份的安全政策和它们的授权来访问系统资源。 2. 双附接集线器(DAC: Dual-attached Concentrator) 双附接集线器(DAC)是FDDI或CDDI集线器有能力接…

OpenGL之深入解析屏幕成像和渲染原理

一、CPU 与 GPU CPU 内部组成:GPU 内部组成(ALU:算术逻辑单元,是能实现多组算术运算和逻辑运算的组合逻辑电路):CPU 和 GPU 因为设计之初需求就不一样,所以它们的组成不同,在计算机中的分工也不同。可以看到,GPU 有更多的 ALU,而 CPU 有 Control 单元和 Cache 单元,…

获取List集合中的最大值和最小值

实现获取List集合中的最大值和最小值共有以下两种方式,根据自己的场景选择合适的方法。 目录 Collections 1、String、Integer、Double类型 2、对象类型 排序 1、Integer类型 2、 基本排序方式: Collections 1、String、Integer、Double类型 当…

GAT的基础理论

文章目录GAT原理(理解用)GAT工作流程计算注意力系数(attention coefficient)加权求和(aggregate)GAT深入理解GAT的实用基础理论(编代码用)1. GAT的底层实现(pytorch&…

认证 (authentication) 和授权 (authorization) 的区别

以前一直傻傻分不清各种网际应用中 authentication 和 authorization, 其实很简单: 这两个术语通常在安全性方面相互结合使用,尤其是在获得对系统的访问权限时。两者都是非常重要的主题,通常与网络相关联,作为其服务基础架构的关键部分。然而…

设计模式(四) —— 观察者模式/发布订阅模式,c和c++示例代码

往期地址: 设计模式(一)——简单工厂模式设计模式(二)——策略模式设计模式(三)——装饰模式 本期主题: 使用c和c代码,讲解观察者模式、发布订阅模式 发布-订阅模式1.什…

设计模式之美-结构型模式-装饰器模式

装饰器模式主要解决继承关系过于复杂的问题,通过组合来替代继承。指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,装饰器模式提供了比继承更有弹性的替代方案将功能附加到对象上…

MySQL-事务处理

MySQL事务 什么是事务 数据中的事务是指数据库执行的一些操作,这些操作最终要么全部执行成功,要么全部失败,不会存在部分成功,部分失败的情况 如果在事务的支持下,最终有两种结果: 操作成功:…