设计模式系列:一文带你领略“访问者模式”的魅力

Vectorless dynamic动态功耗分析——Voltus power 计算工具会根据设计信息和用户提供的activity和switching约束来生成虚拟的worst-case的power vector,难点在于哪些instances视为switching,在没有仿真的前提下如何确定开关的时间,使用timing文件(TWF) 阅读详情

访问者模式相对来说比较抽象和难以理解,可能单纯地通过文字、类图、案例代码大家还是不太容易理解该模式,不过希望大家不要急躁,可以静下心来用心的体会该设计模式的魅力。相信你一定会有所收获。

基本介绍

访问者模式的基本概念:封装一些作用于某种数据结构中元素上的操作。其有一个重要的特征是可以在不改变数据结构的前提下定义一些新的操作。

简单来说访问者模式主要的作用就是将“数据结构”和“数据操作”进行分离,解决这两者之间耦合性的问题。

访问者模式的基本执行原理就是在被访问的类里添加一个接口,用于接待访问者。

一般数情况下,当我们需要对一个数据结构中的元素进行很多不同的操作,并且这些操作彼此之间并没有关联,同时我们还想做到避免因为这些操作而“污染”了这些元素时,就可考虑使用访问者模式。

访问者模式UML类图

在这里插入图片描述

类图讲解

Visitor:抽象访问角色;通常情况下该数据结构中有几个元素就会对应的在该类中为每一个元素提供一个访问操作(方法)。
ConcreteVisitor:具体访问者角色;继承了Visitor并实现了其中定义的所有方法。
Element:抽象元素角色;该类会定义一个accept(接收)方法,用于接收访问者。
ConcreteElement:具体元素角色;继承了Element并实现了其中定义的accept方法。
ObjectStruture:该类定义了数据结构(对象结构),管理了所有元素,并且可以枚举它的元素(也就是遍历)。

案例讲解

案例:开发一个员工审批功能,具体为不同角色的员工可以进行“同意”和“不同意”的审批。

抽象员工类 => 对应Element(抽象元素角色)

public abstract class Workers {

  // 提供一个让访问者访问的方法
  public abstract void accept(Action action);

}

具体员工类

/**
 * 经理
 */
public class Manager extends Workers {

  /**
   *  这里用到了双分派。
   *    第一次分派:在客户端中将具体的Action作为参数传递到Manager中。
   *    第二次分派:Manager类调用Action中的具体方法,并将自己作为参数传入。
   */
  @Override
  public void accept(Action action) {
    action.managerVerify(this);
  }
}

/**
 * 组长
 */
public class GroupLeader extends Workers {

  @Override
  public void accept(Action action) {
    action.groupLeaderVerify(this);
  }
}

抽象行为类 => 对应Visitor(抽象访问角色)

public abstract class Action {

  // 经理进行审批
  public abstract void managerVerify(Manager manager);

  // 组长进行审批
  public abstract void groupLeaderVerify(GroupLeader groupLeader);

}

具体行为类

/**
 * 同意
 */
public class Agree extends Action {

  @Override
  public void managerVerify(Manager manager) {
    System.out.println("经理的审核结果为同意!");
  }

  @Override
  public void groupLeaderVerify(GroupLeader groupLeader) {
    System.out.println("组长的审核结果为同意!");
  }
}

/**
 * 不同意
 */
public class Disagree extends Action {

  @Override
  public void managerVerify(Manager manager) {
    System.out.println("经理的审核结果为不同意!");
  }

  @Override
  public void groupLeaderVerify(GroupLeader groupLeader) {
    System.out.println("组长的审核结果为不同意!");
  }
}

ObjectStructure类

public class ObjectStructure {

  // 维护了一个集合
  private List<Workers> peoples = new ArrayList<>();

  // 增加
  public void attach(Workers workers) {
    peoples.add(workers);
  }

  // 移除
  public void detach(Workers workers) {
    peoples.remove(workers);
  }

  // 显示测评情况
  public void display(Action action) {
    for (Workers people : peoples) {
      people.accept(action);
    }
  }
}

客户端测试类

public class Client {

  public static void main(String[] args) {
    ObjectStructure objectStructure = new ObjectStructure();
    // 添加人
    objectStructure.attach(new Manager());
    objectStructure.attach(new GroupLeader());

    // 同意
    Agree agree = new Agree();
    objectStructure.display(agree);
  }
}

执行结果

在这里插入图片描述

总结

优点:

1、访问者模式符合单一职责原则。
2、可以让数据结构和数据操作之间解耦。
3、避免了因为操作元素而对其造成污染的问题。
4、让程序具有扩展性的情况下还大大增加了灵活性。

缺点:

1、因为具体的元素对访问者公布了实现细节,所以访问者模式是违背了迪米特法则的。这样做会导致元素变化比较困难。
2、因为访问者依赖的是具体的元素而不是其抽象父类,所有该模式还违背了依赖倒转原则。

总结 :访问者模式适用于数据结构相对稳定并且功能需求又经常变化的系统。

今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞加关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。
在这里插入图片描述

【华为OD机试真题】18、喊7的次数重排 | 机试真题+思路参考+代码解析(C++、Java、Py) 题目描述 >喊7是一个传统的聚会游戏,N个人围成一圈,按顺时针从1到N编号。   编号为1的人从1开始喊数,下一个人喊的数字为上一个人的数字加1,但是当将要喊出来的数字是7的倍数或者数字本身含有7的话,不能把这个数字直接喊出来,而是要喊”过”。   假定玩这个游戏的N个人都没有失误地在正确的时机喊了”过”,当喊到数字K时,可以统计每个人喊”过”的次数。   现给定一个长度为N的数组,存储了打乱顺序的每个人喊”过”的次数,请把它还原成正确的顺序,即数组的第i个元素存储编号i的人喊 阅读详情

相关推荐

单细胞轨迹分析实战:基于Monocle和CytoTRACE的细胞分化潜能与状态解析

本文提供了基于Monocle和CytoTRACE的单细胞轨迹分析实战指南。通过乳腺癌数据集,详细演示了从数据准备、伪时序分析、细胞分化潜能评估到分支点功能挖掘的全流程。结合两种工具的优势,能有效解析细胞状态动态演变,为发育和疾病研究提供关键见解。

weixin_29070861的博客 481

访问者模式

访问者模式应用

weixin_41377572的博客 470

TBOX(Telematics Box)在智能网联汽车中的核心功能与应用场景解析

TBOX(Telematics Box)是智能网联汽车的“中枢神经”,基于Android或Linux操作系统,并通过CAN总线与车辆深度交互。它实现了远程控制、车辆状态监控、OTA升级及紧急呼叫(E-CALL)等核心功能,是提升用车安全、便利性与实现车辆持续进化的关键技术组件。

weixin_29158413的博客 805

【设计模式】访问者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

一、访问者模式简介、 二、访问者模式 适用场景、 三、访问者模式 优缺点、 四、访问者模式 与 迭代器模式、 五、代码示例、 1、Game 父类 ( 被访问者 )、 2、VipGame 收费游戏 ( 被访问者 )、 3、FreeGame 免费游戏 ( 被访问者 )、 4、IVisitor 访问者接口、 5、VipVisitor 付费玩家、 6、测试类、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 6859

电商智能客服Agent开发实战:从零到一构建企业级AI助手

电商智能客服Agent是下一代AI应用的核心形态,它不仅能够回答用户问题,还能自主规划任务、调用工具并执行完整工作流程。本文将深入探讨AI Agent的基本概念、技术实现方式及电商场景中的应用,提供完整的开发流程和代码示例,帮助开发者从零开始构建一个功能强大的电商智能客服系统。通过模块化设计、多轮对话记忆管理和工具集成,这个Agent能够处理订单查询、商品推荐、退换货流程等复杂任务,同时具备企业级的安全性和稳定性保障。通过本文的介绍,读者已经掌握了构建电商智能客服Agent的核心技术与实现方法。

m0_64363449的博客 1363

【5G全网建设】Option3X和Option2模式建安市、兴城市和四水市核心网、承载网网络设计与部署

拓扑规划: Option 3X网络拓扑图规划 Option 2网络拓扑图规划 设备部署: 建安市核心网 建安市承载中心机房 建安市骨干汇聚机房 建安市3区汇聚机房 建安市C站点无线机房 兴城市核心网 兴城市承载中心机房 兴城市骨干汇聚机房 兴城市2区汇聚机房 兴城市B站点无线机房 数据配置: 建安市核心网 建安市承载中心机房 建安市骨干汇聚机房 建安市3区汇聚机房 建安市C站点无线机房 兴城市核心网 兴城市承载中心机房 兴城市骨干汇聚机房 兴城市2区汇聚机房 兴城市B站点无线机房 业务调试

weixin_67183034的博客 8868

访问者模式一篇就够了

访问者模式介绍 最复杂的设计模式,并且使用频率不高,《设计模式》的作者评价为:大多情况下,你不需要使用访问者模式,但是一旦需要使用它时,那就真的需要使用了。 访问者模式是一种将数据操作和数据结构分离的设计模式。(觉得太抽象,可以看下面的例子)。 访问者模式的使用场景 对象结构比较稳定,但经常需要在此对象结构上定义新的操作。 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要...

椰汁菠萝 700

2.2 保姆级教程:手把手带你构建第一个 LangGraph 应用

本文是一份保姆级教程,手把手教你构建第一个LangGraph应用——"智能工具助手"Agent。教程分为8个步骤:从环境准备到工具定义(使用Tavily搜索API和自定义计算器),再到定义图状态、创建决策节点和执行节点,最后连接工作流并编译运行。通过这个项目,你将学会如何让Agent智能选择工具(搜索或计算),掌握LangGraph开发的基本流程,为构建更复杂系统打下基础。关键点包括状态管理、节点设计和条件路由的实现。

yonggeit的博客 3117

设计模式之 【访问者模式模式】

访问者模式 定义: 表示一个作用与某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下 定义作用于这些元素的新操作。 什么时候使用呢: 1、一个对象结构包含很多类对象,它们有不同的接口。你想这些对象实施一些依赖于具体类的操作。 2、要扩展新功能,添加目前尚未考虑到的方法。 3、对象结构的类很少改变,但又经常 需要在此结构上定义新的操作时。改变对象结构类要修改接口,代价...

初听不知曲中意,再听已是曲中人。 476

4.3 Langfuse 集成实战:追踪 OpenAI、LangChain 和 LangGraph 应用

本文介绍了如何将Langfuse集成到不同类型的AI应用中,包括原生OpenAI、LangChain和LangGraph应用。主要内容包括: 两种集成模式:手动追踪(精确控制)和自动追踪(通过回调机制) 三种应用场景的集成方案: 原生OpenAI应用:使用langfuse.trace()手动记录对话流程、LLM调用和工具执行 LangChain应用:通过LangfuseCallbackHandler自动追踪Agent执行过程 LangGraph应用:与LangChain相同的自动追踪方式,可可视化节点和状态

yonggeit的博客 3305

C#实现低通和高通滤波算法

低通滤波器允许通过低于某个截止频率的信号成分,并且抑制高于该频率的成分。而高通滤波器则允许通过高于某个截止频率的信号成分,并抑制低于该频率的成分。巴特沃斯滤波器是一种对称的滤波器,具有平坦的幅度响应和最小的群延迟。低通和高通滤波是数字信号处理中常用的滤波技术,用于滤除或增强信号中的特定频率成分。在本篇文章中,我们将使用C#编程语言来实现低通和高通滤波算法。以上就是使用C#实现低通和高通滤波算法的示例代码。你可以根据自己的需求调整截止频率和采样率,将这些代码应用于你的项目中。是滤波器的截止频率,

XisVisual_Basic的博客 1275

领略设计模式的魅力,谈谈组合模式搭配访问者模式

组合模式(composite) 我们都知道文件和文件夹的概念,并且文件是可以存放在文件夹中,文件夹中也可以存放其他文件夹。需要设计一个简单的程序来实现文件夹和文件的关系。 实现思路 文件夹需要存放文件夹和文件,首先想到的是在文件夹中设计两个集合分别来存放文件夹和文件。 有展示文件路径需求时,不清楚在最里层是文件夹还是文件,所以需要把文件夹和文件当做一个对象来处理会更好,都是条目。所以需要创建一个他们共同的父类。 对文件夹的设计优化,创建一个集合容器,容器类型是父类,即解决了既要存放文件夹又要存放文件的问题

诗与远方的博客 527

PrimeTime low power-多电压设计流程(2)

get_power_switches`、`get_supply_nets` 和 `get_supply_ports` 命令的操作方式类似,并具有类似的命令选项。PrimeTime 根据 UPF 命令构建电源供应网络,包括 create_power_domain、create_supply_net、create_supply_set、create_supply_port、set_domain_supply_net 和 connect_supply_net。电源集句柄是为电源域隐式创建的一个抽象电源集。

QRBQ 712

解锁访问者模式:Java编程的灵活之道

解锁访问者模式:Java编程的灵活之道

卓越之识论道,平常之识论事,狭隘之识论人 1355

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

解锁备忘录模式:代码世界的时光机

解锁备忘录模式:代码世界的时光机

卓越之识论道,平常之识论事,狭隘之识论人 854

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

解锁观察者模式:Java编程中的高效事件管理之道

解锁观察者模式:Java编程中的高效事件管理之道

卓越之识论道,平常之识论事,狭隘之识论人 1221

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

解锁桥接模式:Java架构中的解耦神器

解锁桥接模式:Java架构中的解耦神器

卓越之识论道,平常之识论事,狭隘之识论人 1055

深入理解多态性:面向对象编程的核心机制与实战应用

多态性是面向对象编程的三大核心特性之一,它允许同一操作作用于不同的对象,产生不同的执行结果。其核心原理在于通过继承、接口和动态绑定机制,实现接口与具体实现的分离。从技术价值看,多态极大地提升了代码的灵活性和可扩展性,降低了模块间的耦合度,是构建可维护软件系统的基石。在应用场景上,多态广泛应用于插件化架构、策略模式、模板方法模式以及集合框架等设计,例如在Java集合中,List接口可以指向ArrayList或LinkedList等不同实现。通过运行时多态,系统可以在不修改现有代码的前提下,轻松扩展新功能,这正

weixin_34238633的博客 415

访问者模式学习总结

目录 访问者模式 引言 定义 模式结构图 实例 实例说明 实例类图 代码实现 模式扩展 倾斜的“开闭原则” 总结 模式优点 模式缺点 访问者模式 引言 访问者模式是一种较为复杂的行为型设计模式,它包含访问者和被访问元素俩个主要组成部分,这些被访问的元素具有不同的类型,且不同的访问者可以对其进行不同的访问操作。访问者模式使得用户可以在不修改现有系统的情况下扩展系...

江川的博客 917

访问者模式(Visitor模式)

在现实生活中,有些集合对象存在多种不同的元素,且每种元素也存在多种不同的访问者和处理方式。例如,公园中存在多个景点,也存在多个游客,不同的游客对同一个景点的评价可能不同;医院医生开的处方单中包含多种药元素,査看它的划价员和药房工作人员对它的处理方式也不同,划价员根据处方单上面的药品名和数量进行划价,药房工作人员根据处方单的内容进行抓药。 这样的例子还有很多,例如,电影或电视剧中的人物角色,不同的观众对他们的评价也不同;还有顾客在商场购物时放在“购物车”中的商品,顾客主要关心所选商品的性价比,而收银员关心的是

qq_35784669的博客 516

行为型模式(十一):访问者模式

一、模式的定义与特点 访问者(Visitor)模式:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。 它将对数据的操作与数据结构进行分离,是行为型模式中最复杂的一种模式。 访问者模式是一种对象行为型模式,其优点: 1、扩展性好。 能够在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。 2、复用性好。 可以通过访问者来定义整个对象结构通用的功能,从而提高系统的复用程度。 3、灵活性

kayyoo的博客 388

老生常谈:访问者模式

访问者模式的目的: 封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。 问题的提出:System.Collection命名空间下提供了大量集合操作对象。平时我们大多在集合中都是存储的同类型对象,像2.0中的泛型中就规定集合中只能存储指定的对象类型,要么是整形要么是字符型等,否则会报错。如果针对一个保存...

dhka8040652的博客 327

c#设计模式——访问者模式

目录一 UML类图二 例子三 优缺点3.1 优点3.2 缺点 一 UML类图 二 例子 class Program { static void Main(string[] args) { ObjectStructure.Add(new ElementA()); ObjectStructure.Add(new ElementB()); ObjectStructure.VisitorElem

醉风的博客 179

访问者模式总结-java版

目录 访问者模式的简介 访问者模式的抽象代码 访问者模式的具体代码 访问者模式的优点 访问者模式的缺点 访问者模式的适用场景 访问者模式的简介 的行为型设计模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作。例如处方单中的各种药品信息就是被访问的元素,而划价人员和药房工作人员就是访问者。访问者模式使得...

今天吃了吗的博客 521
上一篇: 设计模式系列:一文带你了解“命令模式”
下一篇: 设计模式系列:一文让你领会“迭代器模式”的用途
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值