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

ops/2024/9/25 11:39:04/

设计模式汇总:查看

通俗示例

想象一下你正在开发一个动物园管理系统。在动物园里,有多种动物,如狮子、老虎、长颈鹿等,每种动物都有不同的行为,比如吼叫、吃东西和移动。如果你想要为每种动物添加新的行为,比如“表演节目”,每次都要去修改每种动物的类,这将会非常麻烦。访问者模式提供了一种解决方案:你可以定义一个访问者接口,里面包含了每种动物可以执行的访问(或行为)方法,然后为每种新行为创建具体的访问者类。当需要执行新行为时,只需将访问者传递给动物对象,由动物对象调用访问者的相应方法。这样,添加新行为时就不需要修改动物类了。

通俗解释

访问者模式是一种行为型设计模式,它允许你将算法从它们要操作的对象中分离出来。在访问者模式中,我们有一个称为“访问者”的接口,它定义了对一组称为“元素”的对象的访问操作。每个具体元素类都会接受访问者的访问,而访问者则会为每个元素类实现一个访问操作。这样,当访问者遍历对象结构时,它会逐一调用对应元素的访问操作。

访问者模式的组成通常包括以下几部分:

  • 访问者(Visitor)接口:定义了对每个具体元素类的访问操作。
  • 具体访问者(Concrete Visitor)类:实现了访问者接口,定义了访问元素时的具体行为。
  • 元素(Element)接口:定义了一个接收访问者的方法(通常称为accept)。
  • 具体元素(Concrete Element)类:实现了元素接口,并在accept方法中调用访问者的访问操作。
  • 对象结构(Object Structure):包含了元素对象的集合,并提供遍历这些元素的方法。

访问者模式的优点

  • 扩展性:可以轻松地添加新的访问者类来扩展新的操作,而无需修改现有元素类。
  • 分离性:将操作逻辑从对象结构中分离出来,提高了代码的模块化。
  • 灵活性:访问者可以自由地访问对象结构中的元素,并定义对这些元素的操作。

Python代码示例

以下是一个访问者模式的简单实现:

# 访问者接口
class Visitor:def visit_lion(self, lion):passdef visit_tiger(self, tiger):passdef visit_giraffe(self, giraffe):pass# 具体访问者类
class PerformShowVisitor(Visitor):def visit_lion(self, lion):print(f"{lion.name} is performing a show.")def visit_tiger(self, tiger):print(f"{tiger.name} is performing a show.")def visit_giraffe(self, giraffe):print(f"{giraffe.name} is performing a show.")# 元素接口
class Animal:def accept(self, visitor):pass# 具体元素类
class Lion(Animal):def __init__(self, name):self.name = namedef accept(self, visitor):visitor.visit_lion(self)class Tiger(Animal):def __init__(self, name):self.name = namedef accept(self, visitor):visitor.visit_tiger(self)class Giraffe(Animal):def __init__(self, name):self.name = namedef accept(self, visitor):visitor.visit_giraffe(self)# 对象结构
class Zoo:def __init__(self):self.animals = []def add_animal(self, animal):self.animals.append(animal)def perform_shows(self, visitor):for animal in self.animals:animal.accept(visitor)# 客户端代码
if __name__ == "__main__":zoo = Zoo()zoo.add_animal(Lion("Simba"))zoo.add_animal(Tiger("Shere Khan"))zoo.add_animal(Giraffe("Melman"))show_visitor = PerformShowVisitor()zoo.perform_shows(show_visitor)

在这个例子中,Visitor是访问者接口,PerformShowVisitor是具体访问者类,实现了访问不同动物时的表演行为。Animal是元素接口,LionTigerGiraffe是具体元素类,它们实现了accept方法,该方法接受访问者对象,并调用访问者的相应方法。Zoo是对象结构,它持有一组动物,并提供了perform_shows方法来遍历动物并执行表演。

总结

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


http://www.ppmy.cn/ops/102347.html

相关文章

内存管理篇-14kmalloc机制实现分析

引入这个kmalloc的目的,是因为前面的slab接口太过于复杂,因此需要一个全新的封装kmalloc接口,内存申请编程接口实现。kmalloc底层起始也是基于slab缓存实现的。 1.kmalloc 调用流程 参数解析: 解析 gfp_mask 参数,确定分配时是否…

android交叉编译报错no input files的解决方法

问题描述 安装NDK后,make报错"clang-18: error: no input files",即使直接使用clang命令(例如clang -c test.c)仍然报错。 开发环境 操作系统:win11 虚拟机:WSL ubuntu22.04 NDK版本&#x…

Visio po解版的详细介绍

一、Visio简介 Visio是一款流程图、组织结构图、地平图、工程图等各类专业图表的制作软件。自问世以来,凭借其友好的用户界面、丰富的图形库和强大的编辑功能,已成为行业内使用最广泛的图形设计软件之一。无论是初学者还是专业人士,都能在Vi…

[易聊]软件项目测试报告

一、项目背景 随着互联网发展,各种各样的软件,比如游戏、短视频、购物软件中都有好友聊天功能,这是一个可在浏览器中与好友进行实时聊天的网页程序。“ 易聊 ”相对于一般的聊天软件,可以让用户免安装、随时随地的通过浏览器网页…

Behavior Retrieval: Few-Shot Imitation Learning by Querying Unlabeled Datasets

发表时间:13 May 2023 论文链接:https://readpaper.com/pdf-annotate/note?pdfId1900983943467731200&noteId2446646993511259136 作者单位:Stanford University Motivation:使机器人能够以数据有效的方式学习新的视觉运动…

FLUX 1 将像 Stable Diffusion 一样完整支持ControlNet组件

之前 InstantX 团队做的多合一的 Flux ControlNet 现在开始和 ShakkerAI 合作并推出了:Shakker-Labs/FLUX.1-dev-ControlNet-Union-Pro 该模型支持 7 种控制模式,包括 canny (0), tile (1), depth (2), blur (3), pose (4), gray (5) 和 low quality (6)…

鸿蒙(API 12 Beta3版)【媒体资源使用指导】Media Library Kit媒体文件管理服务

应用可以通过photoAccessHelper的接口,对媒体资源(图片、视频)进行相关操作。 说明 在进行功能开发前,请开发者查阅[开发准备],了解如何获取相册管理模块实例和如何申请相册管理模块功能开发相关权限。文档中使用到p…

Android App启动流程

1.通过 Launcher 启动应用时,点击应用图标后,Launcher 调用 startActivity 启动应用。 2.Launcher Activity 最终调用 Instrumentation 的 execStartActivity 来启动应用。 3.Instrumentation 调用 ActivityManagerProxy (ActivityManagerService 在应…