设计模式- 访问者模式(Visitor Pattern)结构|原理|优缺点|场景|示例

news/2024/10/19 5:30:12/

                                     设计模式(分类)        设计模式(六大原则)   

    创建型(5种)        工厂方法         抽象工厂模式        单例模式        建造者模式        原型模式

    结构型(7种)        适配器模式        装饰器模式        代理模式        ​​​​​​外观模式      桥接模式        组合模式       享元模式

    行为型(11种)      策略模式        模板方法模式        观察者模式        迭代器模式     责任链模式     命令模式    备忘录模式          状态模式         访问者模式        中介者模式 


访问者模式(Visitor Pattern)是一种行为设计模式,它表示一个作用于某对象结构中的各个元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式适用于需要对一个对象结构中的对象进行很多不同类型的运算,而且施加运算的对象又不希望知道这些运算的具体实现的情况。

结构: 访问者模式的主要参与者有:

  1. Visitor(访问者):声明一个访问操作接口,该接口中的每个操作元素对应一个需要访问的对象类的元素。具体访问者则实现了这些操作。
  2. Element(元素):定义一个接受访问者的方法,一般称为accept(),它以一个访问者作为参数。
  3. ConcreteElement(具体元素):实现了Element中的accept()方法,通常会调用访问者的访问方法来完成对一个元素的操作。
  4. ObjectStructure(对象结构):能够枚举它的元素,提供一个接口让访问者可以访问它的元素。

原理: 

        访问者模式通过双分派机制实现。首先,客户端代码将 ConcreteElement 对象传递给访问者对象;然后,访问者对象根据 ConcreteElement 的类型来决定调用哪个具体的操作方法。这样,增加新的元素类型或新的访问操作都很方便,只需增加新的元素类和新的访问者类即可,原有的代码无需修改。

优缺点:

优点:

  • 扩展性好:增加新的操作变得容易,只需要增加新的访问者类即可,符合开闭原则。
  • 封装性好:将数据结构和操作分离,使得操作集合可独立变化。

缺点:

  • 违反了单一职责原则,将数据结构和算法耦合到了一起。
  • 对象结构变化困难:若要增加新的元素类,需要修改访问者接口及所有具体访问者类,违反了开闭原则。
  • 实现较为复杂,不易理解。

应用场景:

  • 需要对对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类。
  • 当需要对一个组合结构中的对象进行很多不同类型的操作,而操作算法又彼此独立时。

 代码示例(以Java为例)

// 访问者接口
interface Visitor {void visit(TextElement element);void visit(ImageElement element);void visit(TableElement element);
}// 具体访问者:统计字符数
class CharacterCounter implements Visitor {int count = 0;@Overridepublic void visit(TextElement element) {count += element.getText().length();}// 图片和表格访问不做处理@Overridepublic void visit(ImageElement element) {}@Overridepublic void visit(TableElement element) {}// 获取统计结果public int getCount() { return count; }
}// 具体访问者:统计图片数量
class ImageCounter implements Visitor {int count = 0;@Overridepublic void visit(TextElement element) {}@Overridepublic void visit(ImageElement element) { count++; }@Overridepublic void visit(TableElement element) {}// 获取统计结果public int getCount() { return count; }
}// 元素接口
interface Element {void accept(Visitor visitor);
}// 具体元素:文本
class TextElement implements Element {private String text;public TextElement(String text) { this.text = text; }public String getText() { return text; }@Overridepublic void accept(Visitor visitor) { visitor.visit(this); }
}// 其他具体元素:图片、表格的定义省略...// 对象结构:文档
class Document {private List<Element> elements;public Document() { elements = new ArrayList<>(); }public void add(Element element) { elements.add(element); }public void print(Visitor visitor) {for (Element e : elements) {e.accept(visitor);}}
}// 示例使用
public class VisitorPatternDemo {public static void main(String[] args) {Document doc = new Document();doc.add(new TextElement("Hello, World!"));doc.add(new ImageElement());doc.add(new TableElement());Visitor counter1 = new CharacterCounter();doc.print(counter1);System.out.println("Total characters: " + counter1.getCount());Visitor counter2 = new ImageCounter();doc.print(counter2);System.out.println("Total images: " + counter2.getCount());}
}

在这个例子中,Document类代表对象结构,它包含不同类型的Element(如TextElementImageElementTableElement等)。通过访问者模式,我们能够为这些不同类型的元素定义新的操作(如统计字符数、图片数),而无需修改元素本身的类。


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

相关文章

IDEA 2022.1版本开始,可以直接运行Markdown里的命令行

参照这种格式&#xff1a; shell mvn clean install注意idea支持的版本&#xff1a;是从 2022.1版本开始的。 ps&#xff1a;之前有人写过了&#xff0c;感觉很实用但是蛮多开发者不一定会知道的功能。 参考资料&#xff1a; https://www.cnblogs.com/didispace/p/16144107.h…

【区块链】共识算法简介

共识算法简介 区块链三要素&#xff1a; 去中心化共识算法智能合约 共识算法作为区块链三大核心技术之一&#xff0c;其重要性不言而喻。今天就来简单介绍共识算法的基本知识。 最简单的解释&#xff0c;共识算法就是要让所有节点达成共识&#xff0c;保证少数服从多数&#x…

用于复杂任务的 AI 编码引擎:多文件多步骤拆解实现 | 开源日报 No.239

plandex-ai/plandex Stars: 3.1k License: AGPL-3.0 plandex 是一个用于复杂任务的 AI 编码引擎。 使用长时间运行的代理完成跨多个文件且需要多个步骤的任务将大型任务分解为较小子任务&#xff0c;逐一实现&#xff0c;直至完成整个工作帮助处理积压工作、使用陌生技术、摆…

iOS获取通讯录的方法

目录 前言 1.什么是CNContactStore 2.获取通讯录权限 1.配置plist文件 2.请求访问通讯录授权 3.通讯录访问权限的其它配置 3.获取通讯录中的联系人 4.获取通讯录中的群组 5.操作联系人 1.增加联系人 2.更新联系人信息 3.删除联系人信息 6.监听通讯录变化 …

《网络安全技术 网络安全众测服务要求》

近日&#xff0c;全国网络安全标准化技术委员会发布《网络安全技术 网络安全众测服务要求》&#xff08;GB/T 43741-2024&#xff0c;以下简称“众测服务要求”&#xff09;&#xff0c;并将在2024年11月1日正式实施。 《众测服务要求》确立了网络安全众测服务的角色及其职责&…

C++顺序容器3——容器适配器

容器适配器 除了顺序容器外&#xff0c;标准库还定义了三个顺序容器适配器&#xff1a;stack、queue和priority_queue。 适配器&#xff08;adaptor&#xff09;是标准库中的一个通用概念。容器、迭代器和函数都有适配器。 本质上&#xff0c;一个适配器是一种机制&#xff…

Flutter笔记:使用Flutter私有类涉及的授权协议问题

Flutter笔记 使用Flutter私有类涉及的授权协议问题 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.cs…

Github 2024-04-30 Python开源项目日报 Top10

根据Github Trendings的统计,今日(2024-04-30统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10TypeScript项目1稳定扩散Web UI 创建周期:512 天开发语言:Python协议类型:GNU Affero General Public License v3.0Star数量:1…