行为型——访问者模式(Visitor)day16

【信息科学与工程学】计算机科学与自动化——第一百三十四篇 编程语言篇 系列一 C/C++01 5. 适用于信号处理。 阅读详情

在结构不变的情况下动态改变对于内部元素的动作

访问者模式基本介绍

1)访问者模式(VisitorPattern),封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
2)主要将数据结构与数据操作分离,解决数据结构和操作耦合性问题
3)访问者模式的基本工作原理是:在被访问的类里面加一个对外提供接待访问者的接口
4)访问者模式主要应用场景是:需要对一个对象结构中的对象进行很多不同操作(这些操作彼此没有关联),同时需要避免让这些操作"污染"这些对象的类,可以选用访问者模式解决

访问者模式的原理类图

在这里插入图片描述
➢对原理类图的说明-即(访问者模式的角色及职责)

  1. Visitor 是抽象访问者,为该对象结构中的ConcreteElement的每一个类声明一个visit 操作
  2. ConcreteVisitor :是一个具体的访问值实现每个有Visitor 声明的操作,是每个操作实现的部分.
  3. ObjectStructure 能枚举它的元素,可 以提供一个高层的接口,用来允许访问者访问元素
  4. Element 定义一个accept方法,接收一个访问者对象
  5. ConcreteElement 为具体元素,实现了accept 方法

访问者模式应用实例

应用实例要求

  1. 将人分为男人和女人,对歌手进行测评,当看完某个歌手表演后,得到他们对该歌手不同的评价(评价有不同的种类,比如成功、失败等),使用访问者模式来说实现
  2. 思路分析和图解(类图)
    在这里插入图片描述
package com.xhl.visitor;

public abstract class Person {

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

package com.xhl.visitor;

//说明
//1.这里我们使用到了双分派,即首先在客户端程序中,将具体状态作为参数传递Woman中(第一次分派)
//2.然后Woman类调用作为参数的”具体方法”中方法getWomanResult,同时将自己(this)作为参数
//传入,完成第二次的分派

public class Woman extends Person{

	@Override
	public void accept(Action action) {
		// TODO Auto-generated method stub
		action.getWomanResult(this);
	}

}
package com.xhl.visitor;

public class Man extends Person{

	@Override
	public void accept(Action action) {
		// TODO Auto-generated method stub
		action.getManResult(this);
	}

}

package com.xhl.visitor;

public abstract class Action {
	
	//得到男性的评价
	public abstract void getManResult(Man man);
	
	public abstract void getWomanResult(Woman woman);
}

package com.xhl.visitor;

public class Success extends Action{

	@Override
	public void getManResult(Man man) {
		// TODO Auto-generated method stub
		System.out.println("男人给改歌手评价成功");
	}

	@Override
	public void getWomanResult(Woman woman) {
		// TODO Auto-generated method stub
		System.out.println("女人给改歌手评价成功");
	}

}
package com.xhl.visitor;

public class Wait extends Action{

	@Override
	public void getManResult(Man man) {
		// TODO Auto-generated method stub
		System.out.println("男人给改歌手评价待定");
	}

	@Override
	public void getWomanResult(Woman woman) {
		// TODO Auto-generated method stub
		System.out.println("女人给改歌手评价待定");
	}

}
package com.xhl.visitor;

public class Fail extends Action{

	@Override
	public void getManResult(Man man) {
		// TODO Auto-generated method stub
		System.out.println("男人给改歌手评价失败");
	}

	@Override
	public void getWomanResult(Woman woman) {
		// TODO Auto-generated method stub
		System.out.println("女人给改歌手评价失败");
	}

}

package com.xhl.visitor;

import java.util.LinkedList;
import java.util.List;

//管理很多人(man、woman)
public class ObjectStructure {
	private List<Person> persons = new LinkedList<>();
	
	public void attach(Person p) {
		persons.add(p);
	}
	
	public void detach(Person p) {
		persons.remove(p);
	}
	
	public void display(Action action) {
		for(Person p : persons) {
			p.accept(action);
		}
	}
}
package com.xhl.visitor;

public class VisitorDemo {

	public static void main(String[] args) {
		ObjectStructure objectStructure = new ObjectStructure();
		
		objectStructure.attach(new Man());
		objectStructure.attach(new Woman());
		
		Success success = new Success();
		objectStructure.display(success);
		
		System.out.println("=======================");
		
		Fail fail = new Fail();
		objectStructure.display(fail);
		
		System.out.println("=======================");
		
		Wait wait = new Wait();
		objectStructure.display(wait);
	}

}

在这里插入图片描述

应用案例的小结-双分派

  • 上面提到了双分派,所谓双分派是指不管类怎么变化,我们都能找到期望的方法运行。双分派意味着得到执行的操作取决于请求的种类和两个接收者的类型
  • 以上述实例为例,假设我们要添加一个Wait的状态类,考察Man类和Woman类的反应,由于使用了双分派,只需增加一个Action子类即可在客户端调用即可,不需要改动任何其他类的代码.

访问者模式的注意事项和细节

➢优点

  1. 访问者模式符合单一职责原则、 让程序具有优秀的扩展性、灵活性非常高
  2. 访问者模式可以对功能进行统一,可以做报表、UI、拦截器与过滤器,适用于数据结构相对稳定的系统

➢缺点

  1. 具体元素对访问者公布细节,也就是说访问者关注了其他类的内部细节,这是迪米特法则所不建议的,这样造成了具体元素变更比较困难
  2. 违背了依赖倒转原则。访问者依赖的是具体元素,而不是抽象元素
  3. 因此,如果一个系统有比较稳定的数据结构,又有经常变化的功能需求,那么访问者模式就是比较合适的.
23种设计模式-访问者(Visitor)设计模式 软考中级-软件设计师 访问者设计模式 阅读详情

相关推荐

24种设计模式类图

设计模式是在特定环境下,为解决某一类通用软件设计问题提供的一套定制的解决方案,描述了对象和类之间的相互作用。 优点: 提供标准以供开发。方便交流,降低对复杂系统理解的难度。 更加简单方便的复用成功的设计。避免不可重用的方案。 使设计方案更加灵活,易于修改。设计模式通常满足多种面向对象的设计原则。 提高开发效率和软件质量。 有助于更加深入的理解面向对象思想,提高编码水平。

设计模式(二十四)行为型:访问者模式详解

访问者模式(Visitor Pattern)是 GoF 23 种设计模式中最具争议性但也最强大的行为型模式之一,其核心价值在于将作用于某种数据结构中的各元素的操作分离出来,封装到一个独立的访问者对象中,使得在不改变元素类的前提下可以定义新的操作。

谦与谦寻的神隐 1889

2024广东省职业技能大赛云计算——集群部署GitLab

题目是这样的:在Kubernetes集群中新建命名空间gitlab-ci,将GitLab部署到该命名空间下,Deployment和Service名称均为gitlab,以NodePort方式将80端口对外暴露为30880,设置GitLab服务root用户的密码为admin@123,将项目包demo-2048.tar.gz导入到GitLab中并命名为demo-2048。GitLab是一个功能强大且灵活的 DevOps 平台,为开发团队和企业提供了从代码管理到持续集成、交付和部署的一整套解决方案。

kuuuugua的博客 4395

42 访问者模式(Visitor模式)详解

行为型模式: 模板方法(Template Method)模式、策略(Strategy)模式、命令(Command)模式、职责链(Chain of Responsibility)模式、状态(State)模式、观察者(Observer)模式、中介者(Mediator)模式、迭代器(Iterator)模式、访问者(Visitor)模式、备忘录(Memento)模式、解释器(Interpreter)模式 在现实生活中,有些集合对象存在多种不同的元素,且每种元素也存在多种不同的访问者和处理方式。例如,公园中存在多

天道·乾坤 的博客 2141

KEPServerEX实战:Modbus TCP与RTU双协议配置详解

本文详细解析了如何使用KEPServerEX软件同时配置与管理Modbus TCP和RTU混合网络。通过实战步骤,指导用户建立双协议通道、配置设备与标签,并分享核心的地址映射规则与通讯故障排查技巧,帮助工业自动化工程师高效集成多协议设备,简化数据采集架构。

weixin_29186249的博客 397

ROS2前置基础教程 | 小鱼教你用CMake依赖查找流程

上面我们用g++、make、cmake三种方式来编译ros2的C++节点。用cmake虽然成功了,但是CMakeLists.txt的内容依然非常的臃肿,我们需要将其进一步的简化。将上面的CmakLists.txt改成下面的样子 接着继续生成和编译 是不是非常的神奇,为什么可以浓缩成那么短的几句指令呢?find_package查找路径对应的环境变量如下。 打开终端,输入指令: 结果 观察PATH变量,你会发现赫然在其中,中的路径如果以或结尾,则自动回退到上一级目录,接着检查这些目录下的 cmake找到这些目录

生活不止眼前的苟且 7159

图解设计模式-Visitor模式

Visitor(访问者):负责对数据结构中每个具体的元素声明一个用于访问的方法。 ConcreteVisitor(具体的访问者):负责实现Visitor角色所定义的接口 Element(元素):表示Visitor角色的访问对象,声明一个接受访问者的accept方法,参数为Visitor角色 ConcreteElement(具体元素):负责实现Element角色定义的接口 ObjectStructu...

localhost 993

麒麟系统下PaddleOCR的离线部署实战:从环境搭建到模型优化

本文详细介绍了在国产麒麟操作系统上离线部署百度PaddleOCR的完整实战流程。从系统环境准备、Conda虚拟环境搭建,到PaddlePaddle框架和PaddleOCR的离线安装,再到预训练模型的本地部署与优化技巧,提供了全面的文字识别解决方案。重点解决了离线环境下依赖包管理、模型量化加速等核心问题,并附带了批量处理与内存监控的进阶代码,适用于对数据安全有严格要求的政务、金融等场景。

docker7nomad的博客 963

23个设计模式一文搞懂

本笔记涵盖 23 种经典设计模式,按创建型、结构型、行为型三大类整理。每个模式配有生活类比、核心思想、结构图解、实现要点、真实应用案例、适用场景、优缺点分析及常见面试题。

weixin_72753562的博客 802

RK3588平台-ES8388音频驱动调试与设备树配置实战

本文详细解析了在RK3588平台上调试ES8388音频驱动的实战过程。内容涵盖Linux音频驱动的三层架构(Machine、Platform、Codec),并重点提供了设备树(DTS)的完整配置示例,包括I2C节点、声卡节点及音频路由设置。文章还分享了驱动加载验证、amixer调试命令以及常见问题(如无声、变调)的排查思路,旨在帮助开发者快速完成RK3588与ES8388的音频系统集成。

mango的博客 806

YOLO26改进策略【Neck】| CVPR 2024 MFM(Modulation Fusion Module,调制融合模块):动态特征加权融合,突出关键特征抑制冗余

本文主要利用DCMPNet中的 MFM 模块优化 YOLO26 的目标检测网络模型。模块通过动态调制特征融合过程,实现了对多尺度、跨层级特征的智能聚合。将其应用于的改进过程中,针对目标检测中边界特征与语义信息的互补性需求,缓解网络中浅层细节与深层语义融合不足的问题。Depth Information Assisted Collaborative Mutual Promotion Network for Single Image Dehazing在图像去雾网络中,不同层级和类型的特征包含着互补的信息(如浅层的

Limiiiing的博客 221

C/C++结构体详解:从基础到高级应用

结构体是C/C++中组织相关数据的复合数据类型,它允许将不同类型的数据项组合成一个逻辑单元,解决了数组只能存储相同类型数据的限制。从内存布局原理来看,结构体通过成员对齐优化访问效率,这种特性使其在系统编程、嵌入式开发等场景中表现优异。在工程实践中,结构体常用于文件格式处理、网络协议实现和数据结构构建,特别是在游戏开发中处理角色属性、图形编程中表示几何图形等场景。通过掌握结构体的定义、初始化、嵌套和内存管理等核心概念,开发者可以构建更高效、更灵活的数据模型。本文以学生信息管理系统为例,深入解析结构体的实际应用

weixin_30367873的博客 316

R语言中5种正态性检验的方法

统计学中的t检验和方差分析等方法的应用条件是样本都来自正态总体或近似正态总体,只有符合这个条件,才能用这些方法来检验各样本所属的总体参数的差异显著性。文本向大家介绍在R语言中检验正态性的几种方法: 1、Kolmogorov-Smirnov检验 K-S检验检验单一样本是否来自某一特定分布。比如检验一组数据是否为正态分布。它的检验方法是以样本数据的累积频数分布与特定理论分布比较,若两者间的差距很小,则推论该样本取自某特定分布族。K-S检验的原假设和备择假设为: H0:样本所来自的总体分布服从

Mrrunsen的博客 2万+

设计模式(Java)—Visitor模式

在数据结构中保存着许多元素,我们会对这些元素进行“处理”。在Visitor模式中,数据结构与处理被分离开来。我们编写一个表示“访问者”的类来访问数据结构中的元素,并把对各元素的处理交给访问类。这样,当需要增加新的处理时,我们只需要编写新的访问者,然后让数据结构可以接受访问者的访问即可。 示例程序 使用Composite模式中用到的那个文件和文件夹的例子作为访问者要访问者的数据结构,访问者会访问由文...

zoinsung_lee的博客 1万+

SolidWorks速成教程P4-4【装配体 | 第四节】——装配体内修改模型&编辑配合方法&配合报错的解决方法

截止目前已介绍完 SolidWorks装配体的常用功能,但基础薄弱的小伙伴或许对装配体的各类功能还不够熟悉。所以这节将进一步加强装配体的学习,同时介绍新手容易犯的错误。总结出三点,一是装配体内修改模型,二是编辑配合,三是配合报错的解决方法。

嵌入式阿齐Archie 5551

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

图解设计模式 (十三) Visitor 模式

读书笔记 仅供参考 简述 通常将数据结构和处理数据的代码放到同一个类中,但是如果有多种处理方式,增加处理方式就会多次修改数据类。Visitor 模式(访问者模式)将数据结构与处理分离开来,增加新的处理时,只需要编写新的访问者就可以了。 UML 和角色 Visitor 负责对数据结构中每个具体的元素(ConcreteElement 角色)声明一个用于访问的 visit 方法。 ConcreteVisitor 负责实现 Visitor 角色定义的接口(API),要实现所有的 visit 方法。

zhangmiaoping23的专栏 477

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

第 18 章 访问者模式

第 18 章 访问者模式 1、测评系统的需求 完成测评系统需求 将观众分为男人和女人,对歌手进行测评,当看完某个歌手表演后,得到他们对该歌手不同的评价(评价有不同的种类,比如成功、失败等) 2、传统方式完成测评系统 传统方式的问题分析 如果系统比较小,还是ok的,但是考虑系统增加越来越多新的功能时,对代码改动较大,违反了ocp原则, 不利于维护 传统方式的扩展性不好,比如增加了新的人员类型,或者管理方法,都不好扩展 引出我们会使用新的设计模式 –-> 访问者模式 3、访问者模式基本介绍 访

Oneby的博客 393

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

android 蓝牙通讯demo

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

创建型——工厂系列(Factory)day04

任何可以产生对象的方法或类,都可以称为工厂 单例也是一种工厂 为什么有了new以后,还要有工厂? 1、灵活控制生产过程 2、权限、修饰、日志…… 接口模式 package cn.xhl.interfacemodel; public interface IFruit { public void plant(); public void harvest(); public void grow(); } package cn.xhl.interfacemodel; public class ..

zero_ko的博客 2502

创建型——建造者(Builder)day06

分离复杂对象的构建和表示 同样的构建过程可以创建不同的表示 建造者模式和模板方法模式非常像 建造者模式强调构造对象 模板方法模式强调方法执行 基本介绍 1、建造者模式(Builder Pattern)又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。 2、建造者模式是一步一步创建一个复 杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。 建造者的四个角色 1、.

zero_ko的博客 2420

结构型——外观模式(Facade)&&行为型——中介者模式(Mediator)day11

结构型——外观模式(Facade) 外观模式基本介绍 外观模式(Facade),外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节 一个简单的例子理解:去一些政府部门办事,会跑很多不同的部门,可能去了部门A,部门A又让你去部门B……这样就很麻烦 如果使用门面模式,用户只需要访问门面,由门面模式去协调内部的关系。 外观模式

zero_ko的博客 442

行为型——命令模式(Command) day15

目录命令模式基本介绍命令模式的原理类图实例——智能生活项目需求命令模式的总结 命令模式基本介绍 命令模式(Command Pattern) :在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计 命名模式使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦。 在命名模式中,会将一个请求封装为一个对象,以便使用不同参数来表示不同的请求(即命名),同

zero_ko的博客 330

设计模式七大原则day01

设计模式七大原则 单一职责原则: 单一职责原则(Single Responsibility Principle, SRP)的定义是:指一个类或者模块应该有且只有一个改变的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起了。一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会遭受到意想不到的破坏。而如果想要避免这种现象的发生,就要尽可能的遵守单一职责原则。此原则的核心就是解耦和增强内聚性。 含义:对于一个类,只有一个引起该类变化的原因;该类的职责是

zero_ko的博客 317

行为型——模板方法模式(Template)day14

模板方法模式基本介绍 模板方法模式 (Template Method Pattern),又叫模板模式(Template Pattern), 指 在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。 简单说, 模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤 这种类型的设计模式属于行为型模式。 模板方法模式原理类图 ➢对原理类图的说明-即(模板方法模式的角色及职责)

zero_ko的博客 313

结构型——适配器模式(Adapter)day07

基本介绍 适配器模式(Adapter Pattemn)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。 其别名为包装器(Wrapper) 适配器模式属于结构型模式 主要分为三类:类适配器模式、对象适配器模式、接口适配器模式 工作原理 适配器模式:将一个类的接口转换成另一种接口.让原本接口不兼容的类可以兼容 从用户的角度看不到被适配者,是解耦的 用户调用适配器转化出来的目标接口方法,适配器再调用被适配者的相关接口方法 用户收到反馈结果

zero_ko的博客 272

结构型——桥接模式(Bridge)day08

桥接模式基本介绍 桥接模式(Bridge模式)是指:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。 是一种结构型设计模式 Bridge模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展 桥接模式原理图 说明: Client类:桥接模式的调用者 抽象类(Abstraction) :维护了Implementor/

zero_ko的博客 269

行为型——策略模式(Strategy)day22

策略模式基本介绍 策略模式(Strategy Patterm) 中,定义算法族(策略组),分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户 这算法体现了几个设计原则,第一、把变化的代码从不变的代码中分离出来;第二、针对接口编程而不是具体类(定义了策略接口) ;第三、多用组合/聚合,少用继承(客户通过组合方式使用策略) . 策略模式的原理类图 说明:从上图可以看到,客户context有成员变量strategy或者其他的策略接口,至于需要使用到哪个策略,我们可以在构造器中指定

zero_ko的博客 248
上一篇: 410. 分割数组的最大值+关于取中间值为什么为(right-left)/2+left,而不是(right+left)/2
下一篇: 行为型——迭代器模式(Iterator)day17
哆唻咪à
博客等级 码龄9年 0粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值