Visitor 观察者模式

软件设计师之设计模式实战:Visitor与Observer模式的应用解析 大家好!在软件开发的学习与实践中,设计模式是提升代码质量和开发效率的重要工具。今天咱们聚焦于Visitor模式和Observer模式,深入解析它们在实际场景中的应用,希望通过交流分享,咱们能共同进步,更熟练地掌握这些设计模式。 阅读详情

模式定义

 

观察者模式将类的结构与操作于该类上的算法分离开,使得模式的使用者能在不改变类结构的前提下自由地对类中的元素进行不同的操作。

使用方法

 


Visitor将自己注册到类对象中,由类对象通过回调的方式来启动观察者访问操作类内部的数据元素或结构。

使用范围

 

  • 类结构内部包含很多具有不同接口的类对象,需要定义针对于具体类的操作
  • 需要对于类结构中的类对象定义不同的操作
  • 需要重新定义或扩展对类结构中的类对象的操作

举例说明

 

假设定义一个汽车的复杂的类结构Car以及Car的组件Engine, Wheel,均作为CarElement的元素存在。

public interface CarElement {
	void accept(CarElementVisitor visitor);
}

--------
public class Wheel implements CarElement{
	private String name;
	Wheel(String name){
		this.name = name;
	}
	public String getName(){
		return name;
	}
	public void accept(CarElementVisitor visitor) {
		visitor.visit(this);
	}

}
--------
public class Engine implements CarElement{

	public void accept(CarElementVisitor visitor) {
		visitor.visit(this);
	}

}


--------
public class Car implements CarElement{
	CarElement[] elements;
	public CarElement[] getElements(){
		return elements.clone();
		
	}
	public void accept(CarElementVisitor visitor) {
		visitor.visit(this);
	}
	
	Car(){
		this.elements = new CarElement[]{
				new Engine(), 
				new Wheel("front two wheels"), 
				new Wheel("back two wheels")
		};
	}

}

每个CarElement的实现类均通过accept()的方法来回调visitor并访问自身。

接下来即可定义一个visitor类,比如Driver。为了使得visitor具有可扩展可延续性,可以将Driver抽象出一个接口来,之后可以根据不同的需求来定义不同的Driver。观察Driver类是如何将自己作为参数注入Car类结构的。

interface CarElementVisitor {
    void visit(Wheel wheel);
    void visit(Engine engine);
    void visit(Car car);
}

--------
public class Driver implements CarElementVisitor{

	public void visit(Wheel wheel) {
		System.out.println("Rolling " + wheel.getName());		
	}

	public void visit(Engine engine) {
		System.out.println("Starting engine");
	}

	public void visit(Car car) {
		System.out.println("I am driving");
		for (CarElement ele:car.getElements()){
			ele.accept(this);
		}		
		System.out.println("going...");
	}

}

最后用一个具体的调用过程来实现visitor。

public class CarVisitorClient {
	public static void main(String args[]){
		Car car = new Car();
		car.accept(new Driver());
	}
}

下载示例

 

TC8:SOMEIPSRV_SD_MESSAGE_07-09 TTL为服务实例的生命周期。在此生命周期之后,不提供服务实例。 阅读详情

相关推荐

Frida动态Hook实战:逆向美团外卖mtgsig3.0签名算法

在移动应用安全与数据爬取领域,API签名是保障请求合法性与数据完整性的核心机制。其原理是通过特定算法,将请求参数、时间戳等动态要素加密生成唯一字符串,服务器端通过验签防止数据篡改与伪造。这项技术的核心价值在于,它构建了客户端与服务器之间的可信通道,是移动端数据交互安全的基础。在自动化测试、安全审计、市场数据分析等应用场景中,理解并能够获取或绕过签名验证是关键前提。本文聚焦于美团外卖App的核心签名参数mtgsig3.0,针对其复杂的算法逻辑,提供了一套基于Frida的动态Hook解决方案。通过Hook技术,

weixin_33935636的博客 835

访问者模式(Visitor Pattern)和观察者模式(Observer Pattern)的区别与使用方法

观察者 访问者 区别

Yuzubansui的博客 545

用STM32F103C8T6和TB6612驱动模块,从零搭建一辆能避障循迹的智能小车(附完整代码)

本文详细介绍了如何使用STM32F103C8T6和TB6612驱动模块从零搭建一辆能避障循迹的智能小车。内容涵盖硬件选型、电路设计、底层驱动配置以及智能行为算法实现,并附有完整代码示例,帮助开发者快速掌握嵌入式开发的核心技术。

weixin_42641741的博客 446

【设计模式】之 Visitor 观察者模式

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace DesignFactory.Visitor { /// /// 访问者模式 /// class

sniper007的专栏 476

【中文OCR】中文字符图片的分割方法

最近想做一个关于中文OCR的小系列,也是对之前做的东西的一个总结。作为这个系列的第一篇,我觉得还是有必要说一下关于中文字符图片分割的问题。因为现在开源的OCR代码比较多,相对而言对字符图片的分割的方法提的比较少,尤其是中文字符图片的分割还是有一定困难在里面的。 一、普遍使用的切割方法 现在大部分开源项目上用切割方法还是基于水平、垂直投影字符切割方法。 原理比较简单容易理解,也比较容易实现。先...

zhangzm0128 1万+

浮点数加法器设计

一.设计内容及其要求 内容 根据浮点数的运算规则和IEEE754标准,实现浮点数的加法运算器。 要求: 浮点数格式:符号位1位,阶码8位,尾数23位 要求该实验能完整的体现浮点数的运算的五个步骤:对阶、尾数求和、规格化、舍入(要求使用对偶舍入)、溢出判断。 二.基本要素 浮点数 浮点数即实数,实数是所有有理数和无理数的集合。它之所以被称作浮点数,是因为小数点在数中的位置并不是固定的。一个浮点数值分为两部分存储:数值以及小数点在数值中的位置。 计算机中的浮点运算的计算结果一般是不确定的,一块芯片的浮点运算

Phoenix_ZengHao的博客 1万+

Visitor模式和Observer观察者模式

所谓访问者模式,就是不同服务提供者对同一种服务提供的服务内容不同。 Typedef std::vector<Ivisitable> VisitbleArray; Typedef std::vector<IVisitor> VisitorArray; Interface IVisitable { void Acc...

aolan7349的博客 451

19、利用PostGIS进行空间分析:更高效的矢量分析方法

本文介绍了如何利用PostGIS进行高效灵活的矢量空间分析,重点探讨了在选址安静住宅场景中使用缓冲区和距离测量两种方法的实现与优化。通过QGIS与PostGIS结合,演示了数据上传、CTE应用、ST_Intersects与ST_Distance函数对比,并深入分析了横向子查询在提升查询性能和代码可读性方面的优势。文章还比较了不同方法的适用场景,并以房地产开发选址为例展示了完整分析流程,最后总结了PostGIS在空间分析中的强大能力与未来应用前景。

d3e4f的博客 92

观察者模式(Observer),责任链模式,访问者模式(Visitor)

概念:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。行为型模式。 main(), IObservable,被观察者接口 CHanFeiZiObservable,被观察者韩非子 IObserver,观察者接口 CLiSiObserver,观察者李斯 CZhouSiObserver观察者周斯 说明:将观察者聚集到被观察者韩

tianyucad123的博客 3822

SAP 批次管理(分割评估)

批次分割评估: 业务场景:企业要求各批次物料成本价格不一样。此时可以采用分割批次来实现不同成本 后台配置: (1)、激活分割评估 后台---物料管理----评估与科目设置---分割评估-----激活分割评估 (2)、配置分割评估 后台---物料管理----评估与科目设置---分割评估-----配置分割评估 进入全局性分类后,批次分割采用已有的评估类型“X自动(批)”: ...

willieyuan的博客 1万+

PCL RANSAC拟合分割多条直线【2026最新版】

使用RANSAC算法拟合分割多条直线,输出每一条直线的拟合参数到控制台,并保存直线点云到本地文件夹。博客长期更新,本文最新更新时间为:2026年5月24日。

点云侠的博客 7974

C#面向对象模式设计第二十四讲:Visitor 观察者模式(行为型模式)

(根据MSDN WebCast相关课程整理) 类层次结构中可能经常由于引入新的操作(虚方法),从而将类型变得脆弱。 如下图是一幅类继承关系的层次结构图, 如果在父类中直接增加一个虚方法时,所有的子类都可能需要改变。如何在不改变类层次与结构的前提下,在运行为根据需要透明的为各个类添加新的方法与操作。 GoF:表示一个作用于某种对象结构中的各元素的操作。它可以不改变各元素的类的前提下,定义作用于这些...

weixin_30498921的博客 87

安装Office程序时无法安装的解决方案

本文主要介绍了安装Office程序时无法安装的解决方案,希望能对安装Office的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 前置步骤 2.2 方法一 2.3 方法二

weixin_43178406的博客 15万+

Java 23种设计模式 (通俗易懂解释收集整理)

(补充中...) P02 抽象工程模式 P14 TemplateMethod 模板方法模式 讲清楚了为什么叫做模板方法 http://www.cnblogs.com/java-my-life/archive/2012/05/14/2495235.html P15 观察者模式(发布订阅模式) http://www.cnblogs.com/wangjq/archive/2012/0...

weixin_30675247的博客 383

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

OGRE中用到的设计模式

1.       单例模式(Singleton) 2.       工厂方法(Factory Method)  3.       适配器模式(Adapter)  4.       桥接模式(Bridge)  5.       职责链模式(Chain of Responsibility)  6.       迭代器模式(Iterator)Ogre::VectorIterato

逍遥剑客 6821

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

设计模式C++学习笔记之十八(Visitor访问者模式)

设计模式C++学习笔记之十八(Visitor访问者模式) 18.1.解释 概念:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 main(),客户 IVisitor,访问者接口 CBaseVisitor,访问者实现类 CEmployee,被访问者抽象类 CCommonEmployee,被访问者实现类之一 CMana

盛胜的专栏 563

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

设计模式笔记-SINGLETON-VISITOR-OBSERVER等等等

感觉设计模式如果没有见过就直接看他的描述,很难懂。 SINGLETON以前在别人的代码里见过,稍微一看这个模式就明白什么意思了。当然这也是一个比较简单的模式 看完书上的介绍之后,有这么几点体会。 本质上说,SINGLETON相当于,给每个类添加一个静态的指向自己的指针。通过一个静态方法返回这个指针,这样,在使用的过程中,只需要包含进来头文件,就可以在任何地方,通过唯一方法,调用到同一个对象。

solofly752的专栏 860

javacc 观察者模式

/////////////////////////////////////////////////////////////////////////////////////// /**************************************************************************************/ >>javacc 观察者模式 只有书写的语

zyb243380456的专栏 708

ABAP与设计模式之观察者模式

原文地址: http://database.chinaunix.net/a2009/0731/616/000000616610.shtml   观察者模式(有时又被称为发布-订阅模式、模型-视图模式、源-收听者模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模

Welcome to Garywang's IT BLOG. 1263

24-访问器(Visitor)

这里写目录标题1. 定义2. 适用场景3. 要点总结4. Demo 1. 定义 2. 适用场景 3. 要点总结 4. Demo

HJ的技术博客 756

Java设计模式之factory、abstract factory、proxy、observer、visitor、state、memento

Java设计模式之factory、abstract factory、proxy、observer、visitor、state、memento设计模式(二)1. Factory(工厂模式)1.1 目的1.2 使用方法1.3 工厂方法的优缺点2. Abstract Factory(抽象工厂模式)2.1 目的2.2 使用方法2.3 抽象工厂方法的优缺点3. Proxy(代理模式)3.1 目的3.2 使用方法3.3 代理模式的优缺点 更新中,待更新内容为observer、visitor、state、memento

qq_44013163的博客 923

设计模式-访问者模式(Visitor)

概述 定义 : 封装作用于某数据结构(如List/Set/Map等)中的各元素的操作 可以在不改变各元素的类的前提下, 定义左用于这些元素的操作 类型 : 行为型 适用场景 一个数据结构(如List/Set/Map等)包含很多类型对象 数据结构与数据操作分离 优点 增加新的操作很容易, 即增加一个新的访问者 缺点 增加新的数据结构困难 具体元素变更比较麻烦 模式角色 Visit...

听雪楼 313

行为型设计模式-Visitor vs Observer

行为型、设计模式、观察者模式、访问者模式

SproutingTime的博客 230

Visitor(访问者)模式

意图:表示一个作用于某对象结构中的各元素的操作。它使程序员可以在不改变各元素的类的前提下定义作用于这些元素的新操作。(1)一个对象结构包含很多类对象,它们有不同的接口,当软件开发者想对这些对象实。施一些依赖于其具体类的操作的时候。

技术日常 216

21.Visitor——访问者模式

demo描述:将人的成功失败属性分离,让这个属性以追加的方式来描述人,而不是写死在类里 demo代码: 人类,被访问者: public abstract class Person { //提供一个方法,让访问者可以访问(定义属性) public abstract void accept(Action action); } //-------------------------------------------------- public class Man extends.

九 235
上一篇: Observer 观察者模式
下一篇: State 模式
zigzagsoft
博客等级 码龄19年 34粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值