Java设计模式 _行为型模式_访问者模式

一、访问者模式

1、访问者模式
访问者模式(Visitor Pattern)是一种行为型模式。它允许在不修改已有类结构的情况下,向类中添加新的操作。访问者模式通过将操作封装在一个访问者对象中,使得可以在不改变各个元素类的前提下,实现对元素的新操作。

2、实现思路
被访问者(元素对象),访问者;
被访问者需要关联到访问者;访问者实现被访问者的方法;
(1)、定义被访问者规范(绑定到访问者中,和其他自身行为)(水果)
(2)、编写被访问者实现类,实现绑定和规范行为(苹果,葡萄)
(3)、编写访问者规范(每一种被访问者的访问方法)(商店)
(4)、编写访问者的实现类,实现访问的具体方法(水果商店)
(5)、实例化被访问者,实例化访问者,被访问者绑定到访问者中

二、代码示例

1、示例场景
水果商店添加水果,添加新的水果,不用修改之前的水果信息和绑定信息
2、代码示例

// 1、定义被访问者规范(水果)
public interface Fruit {void accept(Shop shop);     // 定义绑定关系void info();
}
// 2.1、定义被访问者实现类(苹果)
public class Apple implements Fruit {@Overridepublic void accept(Shop shop) {shop.visit(this);   // 实现访问者绑定被访问者}@Overridepublic void info() {System.out.println("苹果");}
}
// 2.2、定义被访问者实现类(葡萄)
public class Garpe implements Fruit {@Overridepublic void accept(Shop shop) {shop.visit(this);  // 实现访问者绑定被访问者}@Overridepublic void info() {System.out.println("葡萄");}
}
// 3、编写访问者规范
public interface Shop {void visit(Garpe garpe);   // 通过绑定访问被访问者葡萄void visit(Apple apple);  // 通过绑定访问被访问者苹果
}
// 4、编写访问者实现类,水果商店
public class FruitShop implements Shop {@Overridepublic void visit(Garpe garpe) {System.out.println("添加了新水果!" );garpe.info();}@Overridepublic void visit(Apple apple) {System.out.println("添加了新水果!" );apple.info();}
}// 5、测试public static void main(String[] args) {Fruit apple = new Apple();   // 被观察者Garpe garpe = new Garpe();Shop shop = new FruitShop();   // 观察者apple.accept(shop);    // 被观察者被观察者观察garpe.accept(shop);}

在这里插入图片描述

总结:
访问者模式,主要包含访问者和被访问者两种角色的实体,两者之间相互关联,被访问者依附于访问者,访问者可以访问被访问者的方法。

学海无涯苦作舟!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/19825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RedisTemplate实战应用--队列等

一、RedisTemplate队列插入 1、从集合左边插入值 https://blog.csdn.net/weixin_43658899/article/details/121040307 leftPush(K key, V value) redisTemplate.opsForList().leftPush("leftdatakey","bbbb");2、从集合左边开始在v1值后边插入新值v2 le…

使用 Django 连接 MySQL 数据库

文章目录 步骤一:安装必要的库和驱动步骤二:配置数据库连接步骤三:执行数据库迁移步骤四:开始使用 MySQL 数据库创建一个模型迁移模型到数据库使用模型进行数据操作创建新记录:查询记录:更新记录&#xff1…

Mac安装第三方软件的命令安装方式

场景: 打开终端命令行,sudo xattr -rd com.apple.quarantine,注意最后quarantine 后面加一个空格!然后打开Finder(访达),点击左侧的 应用程序,找到相关应用,拖进终端qua…

(超实用)京东订单数据分析案例-维度下钻

1,数据介绍,字段了解 尽可能熟悉业务,多知道字段的含义,字段字段间的逻辑关系,后期数据分析思路才能更清晰,结果才能更准确 2,订单数据分析基本思路 维度下钻 3,代码实现全流程思路…

华为telnet的两种认证方式

华为telnet的两种认证方式 实验拓扑: 实验要求: 1.采用普通密码认证实现telnet 远程登录机房设备R3 2.采用AAA认证服务方式实现telnet 远程登录机房设备R3 实验步骤: 1.完成基本配置(设备接口配置IP,此步骤略过&#…

Facebook的隐私保护挑战:用户数据安全的新时代

在全球范围内,Facebook已经成为了不可忽视的社交媒体巨头,它连接着超过20亿的活跃用户。然而,随着其影响力的不断扩大,关于用户隐私和数据安全的问题也愈加引人关注。本文将深入探讨Facebook面临的隐私保护挑战,以及它…

解析前端开发中同源策略与配置代理

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 在前端开发中,跨域请求是一个常见的问题。同源策略限制了浏览器中一个页面…

Unity中的MVC框架

基本概念 MVC全名是Model View Controller 是模型(model)-视图(view)-控制器(controller)的缩写 是一种软件设计规范,用一种业务逻辑、数据、界面显示 分离的方法组织代码 将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时&#x…

【嵌入式硬件】DRV8874电机驱动

目录 1 芯片介绍 1.1 特性简介 1.2 引脚配置 1.3 最佳运行条件 2 详细说明 2.1 PMODE配置控制模式 2.1.1 PH/EN 控制模式 2.1.2 PWM 控制模式 2.1.3 独立半桥控制模式 2.2 电流感测和调节 2.2.1 IPROPI电流感测 2.2.2 IMODE电流调节 3.应用 3.1设计要求 3.2 设计…

AI换脸FaceFusion一键云部署指南

大家好,从我开始分享到现在,收到很多朋友的反馈说配置很低玩不了AI。本篇是一个云端部署AI项目的指南,帮助大家在云端进行AI项目的部署。我会从云平台的选择、代码部署、保存镜像几个方面进行详细的介绍。没有代码基础的小白也不用担心&#…

乐观锁 or 悲观锁 你怎么选?

你有没有听过这样一句话:悲观者正确,乐观者成功​。那么今天我来分享下什么是乐观锁​和悲观锁。 乐观锁和悲观锁有什么区别,它们什么场景会用 乐观锁 乐观锁基于这样的假设:多个事务在同一时间对同一数据对象进行操作的可能性很…

工厂模式详情

一.介绍工厂模式的用途与特点 工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。定义工厂方法模式(Fatory Method Pattern)是指定义一个创建对象的接口,但让实现这个接口的类来决定实例…

Python导出Jira列表

import requests import urllib3 urllib3.disable_warnings() from jira import JIRA import pandas as pd def login_jira(username,password):jira JIRA("https://jira.cn/",basic_auth(username,password))#projectsjira.project(id13)# jqlproject"云链-…

基于强化学习的控制率参数自主寻优

1.介绍 针对控制建模与设计场景中控制参数难以确定的普遍问题,提出了一种基于强化学习的控制律参数自主优化解决方案。该方案以客户设计的控制律模型为基础,根据自定义的控制性能指标,自主搜索并确定最优的、可状态依赖的控制参数组合。 可…

unity打包的WebGL部署到IIS问题

部署之后会出错,我遇到的有以下几种; 进度条卡住不动 明明已经部署到了IIS上,为什么浏览网页的时候还是过不去或者直接报错。 进度条卡住不动的问题其实就是wasm和data的错误。 此时在浏览器上按F12进入开发者模式查看错误(下图…

付费工具逻辑

1.付费推广目的: 传播信息心理暗示;扩大销售,指导消费;树立形象,塑道品牌; 2.付费和免费广告: 付费主要为了增加曝光;免费广告一般比付费广告转化率高; 3.平台广告交…

《Kubernetes部署篇:基于麒麟V10+ARM64架构部署harbor v2.4.0镜像仓库》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:企业级K8s集群运维实战 一、环境信息 K8S版本 操作系统 CPU架构 服务版本 1.26.15 Kylin Linux Advanced Server V10 ARM64 harbor v2.4.0 二、部…

chrome谷歌浏览器开启Gemini Nano模型

前提 确保您的操作系统语言设置为英语(美国) 可能还需要将 Chrome 浏览器的语言更改为英语(美国)。 下载dev或Canary版本Chrome Chrome Canary Chrome Dev 注意:确认您的版本高于 127.0.6512.0。 其中一个Chrome版本不行就切换另外一个版本 绕过性能检查 Tab输入: …

结构体相关习题的补充

结构体相关习题的补充 题目1: 如有以下代码: struct student {int num;char name[32];float score; }stu;则下面的叙述不正确的是:( ) A.struct 是结构体类型的关键字 B.struct student 是用户定义的结构体类型 C.num, score 都是结构体…

正邦科技(day4)

烧录 一、烧录固件二、 通讯模块升级1:USB的方式升级固件2:通过mqtt的方式升级固件3:切换环境 三、 烧录WiFi1:短接2:烧录脚本 设备注意事项: 第一种方式:通信模组和MCU都可以统一烧录BoodLoade…