访问者模式

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

访问者模式

在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作

介绍

意图:

  • 主要将数据结构与数据操作分离

主要解决:

  • 稳定的数据结构和易变的操作耦合问题

何时使用:

  • 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,使用访问者模式将这些封装到类中

如何解决:

  • 在被访问的类里面加一个对外提供接待访问者的接口

关键代码:

  • 在数据基础类里面有一个方法接受访问者,将自身引用传入访问者

应用实例:

优点:

  • 符合单一职责原则
  • 优秀的扩展性
  • 灵活性

缺点:

  • 具体元素对访问者公布细节,违反了迪米特原则
  • 具体元素变更比较困难
  • 违反了依赖倒置原则,依赖了具体类,没有依赖抽象

使用场景:

  • 对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作
  • 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,也不希望在增加新操作时修改这些类

注意事项:

  • 访问者可以对功能进行统一,可以做报表、UI、拦截器与过滤器

实现

我们将创建一个定义接受操作的 ComputerPart 接口。Keyboard、Mouse、Monitor 和 Computer 是实现了 ComputerPart 接口的实体类。我们将定义另一个接口 ComputerPartVisitor,它定义了访问者类的操作。Computer 使用实体访问者来执行相应的动作。VisitorPatternDemo,我们的演示类使用 Computer、ComputerPartVisitor 类来演示访问者模式的用法
在这里插入图片描述

  1. 定义一个表示元素的接口
    //ComputerPart.java
    public interface ComputerPart {
       public void accept(ComputerPartVisitor computerPartVisitor);
    }
  1. 创建扩展了上述类的实体类
    //Keyboard.java
    public class Keyboard  implements ComputerPart {

       @Override
       public void accept(ComputerPartVisitor computerPartVisitor) {
          computerPartVisitor.visit(this);
       }
    }

    //Monitor.java
    public class Monitor  implements ComputerPart {

       @Override
       public void accept(ComputerPartVisitor computerPartVisitor) {
          computerPartVisitor.visit(this);
       }
    }

    //Mouse.java
    public class Mouse  implements ComputerPart {

       @Override
       public void accept(ComputerPartVisitor computerPartVisitor) {
          computerPartVisitor.visit(this);
       }
    }

    //Computer.java
    public class Computer implements ComputerPart {

       ComputerPart[] parts;

       public Computer(){
          parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()};
       }


       @Override
       public void accept(ComputerPartVisitor computerPartVisitor) {
          for (int i = 0; i < parts.length; i++) {
             parts[i].accept(computerPartVisitor);
          }
          computerPartVisitor.visit(this);
       }
    }
  1. 定义一个表示访问者的接口
    //ComputerPartVisitor.java
    public interface ComputerPartVisitor {
       public void visit(Computer computer);
       public void visit(Mouse mouse);
       public void visit(Keyboard keyboard);
       public void visit(Monitor monitor);
    }
  1. 创建实现了上述类的实体访问者
    //ComputerPartDisplayVisitor.java
    public class ComputerPartDisplayVisitor implements ComputerPartVisitor {

       @Override
       public void visit(Computer computer) {
          System.out.println("Displaying Computer.");
       }

       @Override
       public void visit(Mouse mouse) {
          System.out.println("Displaying Mouse.");
       }

       @Override
       public void visit(Keyboard keyboard) {
          System.out.println("Displaying Keyboard.");
       }

       @Override
       public void visit(Monitor monitor) {
          System.out.println("Displaying Monitor.");
       }
    }
  1. 使用 ComputerPartDisplayVisitor 来显示 Computer 的组成部分
    //VisitorPatternDemo.java
    public class VisitorPatternDemo {
       public static void main(String[] args) {

          ComputerPart computer = new Computer();
          computer.accept(new ComputerPartDisplayVisitor());
       }
    }
设计模式实验报告-建造者 设计模式实验报告-建造者,有代码实例和运行结果 立即下载

相关推荐

【作业实验七】-访问者和中介者模式.zip

(1)Homework 4.2-1.doc (2)Homework 4.4-1.doc 1)Write code for ShoeInfoVisitor to implement all the methods in this class to get descriptions of all the kind of shoes Also in the client class SportsShoesGUI, add necessary methods to get the information about the selected shoes

访问者模式学习总结

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

江川的博客 917

访问者模式在实际开发中的Demo

http://blog.youkuaiyun.com/b275518834/article/details/8450276

行为型模式——访问者模式

概述 在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。 介绍 意图 主要将数据结构与数据操作分离。 主要解决 稳定的数据结构和易变的操作耦合问题。 何时...

ai-exception的博客 503

软件体系结构实验报告(设计模式)

软件体系结构实验报告(设计模式):包含策略模式,代理模式,观察者模式,外观模式,组合模式,抽象工厂,单例,工厂方法,简单工厂,适配器模式,附有代码实例和类图

设计模式所有实验及实验报告及代码.zip

软件设计模式概述 2GoF 的 23 种设计模式 3UML中的类图及类图之间的关系 4开闭原则 5里氏替换原则 6依赖倒置原则 7单一职责原则 8接口隔离原则 9迪米特法则 10合成复用原则 11创建型模式的特点和分类 12单例模式 13原型模式 14工厂方法模式 15抽象工厂模式 16建造者模式 17结构型模式概述 18代理模式 19适配器模式 20桥接模式 21装饰模式 22外观模式 23享元模式 24组合模式 25行为型模式概述 26模板方法模式 27策略模式 28命令模式 29责任链模式 30状态模式 31观察者模式 32中介者模式 33迭代器模式 34访问者模式 35备忘录模式 36解释器模式 37UMLet的使用与类图的设计 38创建型模式应用实验 39结构型模式应用实验 40行为型模式应用实验 所有实验及实验报告及代码

【设计模式二十五之访问者模式VisitorPattern】访问者VisitorPattern模式

访问者模式细说访问者模式细说访问者模式定义UML模型基于UML的代码场景一场景代码场景二场景代码访问者模式应用和注意事项 细说访问者模式 提示: 博主:章飞 _906285288的博客 博客地址:http://blog.youkuaiyun.com/qq_29924041 细说访问者模式 定义 UML模型 基于UML的代码 场景一 场景 代码 场景二 场景 代码 访问者模式应用和注意事项 欢迎继续...

章飞 _906285288的博客 505

软件设计模式实验报告完整版

武汉科技大学软件设计模式实验报告完整版

访问者模式(VisitorPattern)

定义 被访问对象放开胸怀,接受不同的访问者进行访问,且访问者对被访者数据进行处理。 结构图 角色与理解 访问者模式共分为五种角色: Visitor(抽象访问者):内部声明一个对每一个具体元素进行访问的操作。 Concrete Visitor(具体访问者):继承抽象访问者,实现对所有具体元素的一种访问操作。 Element(抽象元素):声明accept()方法,以抽象访问者作为参数,供访问者访问。 Concrete Element(具体元素):实现accept()方法,调用访.

码农架构 535

大数据课程综合实验案例:网站用户行为分析

大数据课程综合实验案例1 案例简介1.1 案例目的1.2 适用对象1.3 时间安排1.4 预备知识1.5 硬件要求1.6 软件工具1.7 数据集1.8 案例任务1.9 实验步骤2 本地数据上传到数据仓库Hive2.1 实验数据集的下载2.2 数据集的预处理(1)删除文件第一行记录,即字段名称(2)对字段进行预处理(3)导入数据库3 Hive数据分析3.1 操作Hive3.2 简单查询分析3.3 查询条数统计分析3.4 关键字条件查询分析3.4.1 以关键字的存在区间为条件的查询3.4.2 关键字赋予给定值为

weixin_44616879的博客 1万+

Vivado加上VsCode让你的生活更美好

VsCode与Vivado的灵活使用 引言 ​ 现在大二了,在接触硬件描述语言。Vivado自带的编辑器实在很难用,为了能够“极客”一些,当然是去Google了一下有哪些方法可以取而代之。 ​ 网络上的答案大同小异,基本上都是用的Sublime Text.(我的学长们也几乎都是) 平时码代码的过程中,我习惯与使用VsCode,尤其是在微软收购GitHub之后,Code 简直就是神器了。于是乎…一个...

qq_39498701的博客 10万+

设计模式访问者模式(VisitorPattern)

核心模块:抽象访问者、具体访问者、抽象元素、具体元素、对象结构 所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git 目的:封装一些施加于某种数据元上上的操作,使不改变元素类的情况下定义作用于这个元素的新操作; 使用场景:数据元很少改变,但是数据元上的操作经常改变; 优点:方便添加新操作,有关元素对象的访问

didiao11300的专栏 273

小爱音箱Play增强版刷机接入大模型:自定义唤醒词与远程控制全攻略

智能音箱作为家庭语音入口,受限于厂商预设技能,难以满足个性化需求。通过串口刷机与Linux系统分区改造,可以完全掌控设备底层,将豆包、通义千问等大模型API接入原有音频链路,实现真正智能的语音问答。自定义唤醒词打破了“小爱同学”的唯一唤醒方式,结合ESP32-S3外挂模块,还能优化远场拾音。更深入的应用在于将音箱打造为家庭中控,通过大模型工具调用解析自然语言指令,实现远程控制电脑、智能灯等设备。本文从设备选型、拆机串口、系统备份到语音链路搭建,完整梳理了小爱音箱Play增强版的改造路径,适合具备动手能力的开

weixin_30036289的博客 748

设计模式 - 学习笔记 - VisitorPattern 访问者模式

设计模式 - 学习笔记 - 访问者模式VisitorPattern学习总结代码示例养身保健接口具体养身保健服务访问者接口具体访问者程序猿old镖客运行结果参考资料 学习总结 访问者模式的目的是将数据与操作数据的行为解构开,针对已知的数据(Element),可以扩展不同的行为(Visitor). 养身保健的服务是固定的(比如只有4个)。 访问者接口决定所有访问者都知道有4个服务。 可扩展点就是访问者。通过创建新的访问者实现访问者接口来实现扩展。 局限在于保健服务定死了。如果需要添加新服务,那么所有访问者都要

灵台方寸山斜月三星洞 556

Windows 10 本地开发环境:用 ShardingSphere-Proxy 5.4.1 快速搭建 MySQL 分库分表测试环境

本文详细介绍了在Windows 10系统中使用ShardingSphere-Proxy 5.4.1快速搭建MySQL分库分表测试环境的完整教程。从环境准备、MySQL配置到ShardingSphere-Proxy的核心设置,逐步指导开发者完成本地开发环境的搭建,并提供了分片策略详解和常见问题排查方法,帮助开发者高效验证分库分表功能。

weixin_28366053的博客 215

基于混合智能框架的景区边界范围预测与补全系统

摘要 本文提出一种混合智能框架,结合随机森林模型和GIS规则约束,解决景区边界缺失问题。系统基于Python和ArcGIS平台,利用多源地理空间数据训练随机森林分类器预测景区范围,并集成地形、水文、道路等GIS规则进行优化。实验结果表明,该方法能有效预测15000个景区的边界,精度优于单一模型。创新点在于: 1)数据驱动与知识驱动相结合的混合智能范式; 2)面向全国尺度的大规模边界补全; 3)提供完整的Python+ArcGIS实现方案。该系统为景区精细化管理提供了技术支撑,具有实用价值。

huanghm88的专栏 288

访问者模式(visitorpattern)

/** * 访问者模式 * @author TMAC-J * 在客户端和元素之间添加一个访问者 * 当你需要添加一些和元素关系不大的需求时,可以直接放在访问者里面 * 或者是元素之间有一些公共的代码块,你可以把它放在访问者里面,就不用写重复代码了 * 适用于元素数据基本不变,操作不断变化的场景 * 可以不改变元素类,只改变访问者类,个人觉得这个访问者类相当于一个管理...

weixin_30335575的博客 99

在 Zynq 7010 上运行 VxWorks 7.0 的详细流程【持续更新】

本文介绍了在Zynq 7010开发板上运行VxWorks 7.0的完整流程。主要包括:1)使用Vivado创建硬件设计,配置Zynq模块并生成比特流文件;2)通过Workbench 4创建VxWorks工程,配置启动参数并生成镜像;3)下载运行步骤。此外还讲解了使用Workbench 4开发VSB和VIP工程的方法,包括工程创建、配置和调试流程。文中提供了关键操作截图和注意事项,为开发者提供了完整的Zynq 7010平台VxWorks开发解决方案。

weixin_45397344的博客 1224

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

访问者模式 在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。 介绍 意图:主要将数据结构与数据操作分离。 主要解决:稳定的数据结构和易变的操作耦合问题。

458

《AgentScope-Java 深入浅出教程》第3章 消息系统(Message)

在 AgentScope 中,消息(Msg)是最核心的数据结构。│ 消息的作用 ││ ││ │ 用户输入 │ ────────────┐ ││ ▼ ││ │智能体通信│ ◄────► │ 消息对象 │ ◄────► │ LLM API │ ││ ▲ ││ │ ││ │ 历史存储 │ ────────────┘ ││ │用户输入:封装用户的问题和指令智能体输出:封装智能体的回复和工具调用智能体通信:在多智能体系统中传递信息LLM API 交互:转换为 LLM 可理解的格式历史存储。

步子哥的博客 232

大模型量化方法总结

本文主要对大模型量化方法进行了总结,希望对学习大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 模型精度 3. 量化方法 3.1 方法一 3.2 方法二 3.3 方法三

herosunly的博客 1万+

访问者模式 VisitorPattern

待访问对象的抽象 using System; public abstract class NiceGirl { private string _Name, _Age, _HairColor, _SkinColor, _EyesColor, _Clothes, _Shoes, _Bag; public NiceGirl(string name, string age...

feiliboos 96

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

访问者模式的意图

访问者模式的访问者,是做专项检查的。

yqj2065的博客 2821

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: 模板模式
下一篇: 拦截过滤器模式
炒栗子不加糖
博客等级 码龄10年 68粉丝 123原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值