设计模式——访问者模式
访问者模式是什么?
表示一个作用于某对象结构中的各元素的操作,它使你可以再不改变各元素的类的前提下定义作用于这些元素的新操作
访问者模式解决什么问题?
男女在不同情境下表现的不同
abstract class Person {protected String action;public String getAction() {return action;}public void setAction(String action) {this.action = action;}public abstract void getConclusion();
}class Man extends Person {@Overridepublic void getConclusion() {if ("逛街".equals(action)) {System.out.println(this.getClass().getSimpleName() + action + "买完就走");} else if ("吃饭".equals(action)) {System.out.println(this.getClass().getSimpleName() + action + "狼吞虎咽");}}
}class Woman extends Person {@Overridepublic void getConclusion() {if ("逛街".equals(action)) {System.out.println(this.getClass().getSimpleName() + action + "到处乱逛");} else if ("吃饭".equals(action)) {System.out.println(this.getClass().getSimpleName() + action + "细嚼慢咽");}}
}
使用时
List<Person> personList = new ArrayList<>();Man man = new Man();
man.setAction("逛街");
personList.add(man);Woman woMan = new Woman();
woMan.setAction("逛街");
personList.add(woMan);for (Person person : personList) {person.getConclusion();
}
当要新增新的Action时,要修改两者的代码
访问者模式实现
创建不同的表现
abstract class Action {abstract void getManConclusion(Man concreteElementA);abstract void getWomanConclusion(Woman concreteElementB);
}class Shopping extends Action {@Overridevoid getManConclusion(Man concreteElementA) {System.out.println(concreteElementA.getClass().getSimpleName() + " " + getClass().getSimpleName() + "买完就走");}@Overridevoid getWomanConclusion(Woman concreteElementB) {System.out.println(concreteElementB.getClass().getSimpleName() + " " + getClass().getSimpleName() + "到处乱逛");}
}class eat extends Action {@Overridevoid getManConclusion(Man concreteElementA) {System.out.println(concreteElementA.getClass().getSimpleName() + " " + getClass().getSimpleName() + "狼吞虎咽");}@Overridevoid getWomanConclusion(Woman concreteElementB) {System.out.println(concreteElementB.getClass().getSimpleName() + " " + getClass().getSimpleName() + "细嚼慢咽");}
}
创建男女,这里采用双分派,先将Action作为传递给男/女,再将男/女作为参数传入给Action,意味着执行结果取决于两个调用者的类型
abstract class Person {abstract void accept(Action visitor);
}class Man extends Person {@Overridevoid accept(Action visitor) {visitor.getManConclusion(this);}
}class Woman extends Person {@Overridevoid accept(Action visitor) {visitor.getWomanConclusion(this);}
}
创建对象结构统一管理和遍历
class ObjStructure {private List<Person> mPersonList = new ArrayList<>();public void attach(Person person) {mPersonList.add(person);}public void detach(Person person) {mPersonList.remove(person);}public void display(Action visitor) {for (Person person : mPersonList) {person.accept(visitor);}}
}
调用时
ObjStructure objStructure = new ObjStructure();objStructure.attach(new Man());objStructure.attach(new Woman());objStructure.display(new Shopping());objStructure.display(new eat());
- 当要增加Action时,只需要新增一个类和修改上面的代码
- 但是如果新增一个外星人的话,就要在每个Action中新增对应方法,故访问者模式适用于数据结构稳定但算法易变化的情况
相关文章:
设计模式——访问者模式
访问者模式是什么? 表示一个作用于某对象结构中的各元素的操作,它使你可以再不改变各元素的类的前提下定义作用于这些元素的新操作 访问者模式解决什么问题? 男女在不同情境下表现的不同 abstract class Person {protected String action…...
一文读懂UTF-8的编码规则
之前写过一篇文章“一文彻底搞懂计算机中文编码”里面只是介绍了GB2312编码知识,关于utf8没有涉及到,经过查询资料发现utf8是对unicode的一种可变长度字符编码,所以再记录一下。 现在国家对于信息技术中文编码字符集制定的标准是《GB 18030-…...
二叉树题目:路径总和 II
文章目录 题目标题和出处难度题目描述要求示例数据范围 前言解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题:路径总和 II 出处:113. 路径总和 II 难度 4 级 题目描述 要求 给你二叉树的根结点 root \tex…...
Qt model/view 理解01
在 Qt 中对数据处理主要有两种方式:1)直接对包含数据的的数据项 item 进行操作,这种方法简单、易操作,现实方式单一的缺点,特别是对于大数据或在不同位置重复出现的数据必须依次对其进行操作,如果现实方式改…...
c与c++中的字符串
在c中,string本质上是一个类; string与char *有些区别: char*是一个指针;string是一个类,类内封装了char*,管理这一个字符串,是一个char*的容器 在使用string类型时,要加上其头文…...
Android 获取IP地址的Ping值 NetworkPingUtils
项目里需要对动态配置的Ip列表都去ping下延迟,取出其中最小的三个进行随机取值然后去连接,倒腾了一下午终于搞出来了! 需求实现思路: 1.找到方法去ping IP地址; 2.同时去Ping,不能让用户等待;…...
数据集笔记:OpenCelliD(手机基站开放数据库)
下载数据的方式可见:【数据获取】全球最大手机基站开源数据库 1 读取数据 import pandas as pdpd.read_csv(C:/Users/16000/Downloads/454.csv/454.csv,headerNone,names[radio,mcc,net,area,cell,unit,lon,lat,range,samples,changeable1,created1,updated,AveSi…...
Windows电脑多开器的使用心得分享
Windows电脑多开器是一种非常实用的软件工具,它可以让我们在同一个电脑上同时运行多个不同的应用程序,从而提高我们的工作和学习效率。以下是我在使用Windows电脑多开器时的一些心得分享: 确保你的电脑配置足够强大 多开软件需要消耗大量的…...
Android Studio实现简易计算器(带横竖屏,深色浅色模式,更该按钮颜色,selector,style的使用)
目录 前言 运行结果: 运行截屏(p50e) apk文件 源码文件 项目结构 总览 MainActivity.java drawable 更改图标的方法: blackbutton.xml bluebuttons.xml greybutton.xml orangebuttons.xml whitebutton.xml layout 布…...
虚拟机通过nat模式端口映射实现内网穿透
虚拟机通过nat模式端口映射实现内网穿透 1.网络状态 windows虚拟主机的IP为局域网的私有IP192.168.1.7linux的虚拟主机IP为nat的172.36.4.1062.linux修改nat模式的端口映射 3.windows宿主机防火墙添加规则,(或者直接关闭公共网络防火墙,不安全…...
计算机网络(六):应用层
参考引用 计算机网络微课堂-湖科大教书匠计算机网络(第7版)-谢希仁 1. 应用层概述 应用层是计算机网络体系结构的最顶层,是设计和建立计算机网络的最终目的,也是计算机网络中发展最快的部分 早期基于文本的应用 (电子邮件、远程登…...
Sublime Text 4 for Mac激活下载
Sublime Text for Mac是一款适用于Mac平台的文本编辑器。它具有快速的性能和丰富的功能,可以帮助用户快速进行代码编写和文本编辑。 软件下载:Sublime Text 4 for Mac激活下载 该软件具有直观的界面和强大的功能,包括多行选择、代码折叠、自动…...
存在负权边的单源最短路径的原理和C++实现
负权图 此图用朴素迪氏或堆优化迪氏都会出错,floyd可以处理。 负环图 但floyd无法处理负权环,最短距离是无穷小。在环上不断循环。 经过k条边的最短距离(可能有负权变) 贝尔曼福特算法(bellman_ford)就是解决此问题的。 原理 …...
15-自动化测试——理论知识
目录 1.什么是自动化测试? 2.常见的自动化测试分类 2.1.单元测试(Java、Python) 2.2.接口测试(Java、Python) 2.3.UI测试(移动端、网站) 3.如何实施自动化测试? 4.自动化测试…...
学信息系统项目管理师第4版系列17_干系人管理
1. 项目经理和团队管理干系人的能力决定着项目的成败 2. 干系人满意度应作为项目目标加以识别和管理 3. 发展趋势和新兴实践 3.1. 识别所有干系人,而非在限定范围内 3.2. 确保所有团队成员都涉及引导干系人参与的活 3.3. 定期审查干系人群体,可与单…...
专业PDF编辑阅读工具PDF Expert mac中文特点介绍
PDF Expert mac是一款专业的PDF编辑和阅读工具。它可以帮助用户在Mac、iPad和iPhone等设备上查看、注释、编辑、填写和签署PDF文档。 PDF Expert mac软件特点 PDF编辑:PDF Expert提供了丰富的PDF编辑功能,包括添加、删除、移动、旋转、缩放、裁剪等操作…...
处理机调度的概念,层次联系以及七状态模型
1.基本概念 当有一堆任务要处理,但由于资源有限,这些事情没法同时处理。 这就需要确定某种规则来决定处理这些任务的顺序,这就是“调度”研究的问题。 2. 三个层次 1.高级调度(作业调度) 高级调度(作业…...
PS 图层剪贴蒙版使用方法
好 我们先打开PS软件 后面我们需要接触图框工具 在学习图框工具之前 先要掌握剪贴蒙版 这里 我们先点击左上角文件 然后选择新建 我们先新建一个画布出来 然后 我们点击 箭头指向处 新建一个空白图层 点击之后 会就多出一个空白图层 我们在这里 找到 矩形选框工具 然后 …...
总结1008
今日有些小摆烂,在家学习的日子,确实感觉不如在学校好,无论是在时间上,还是在效率上。在家复习效果因人而异吧,都到这个关键阶段了,可不能掉链子啊,明天势必要拿出100%的状态,心静不…...
软件工程从理论到实践客观题汇总(头歌第九章至第十七章)
九、软件体系结构设计 1、软件体系结构设计概述 2、软件体系结构模型的表示方法 3、软件体系结构设计过程 4、设计初步的软件体系结构 5、重用已有软件资源 6、精化软件体系结构 7、设计软件部署模型 8、文档化和评审软件体系结构设计 十、软件用户界面设计 1、用户界面设计概…...
AI代码工程化实战:从生成到部署的确定性框架
1. 项目概述:从“AI画饼”到“AI交付”的工程化桥梁如果你和我一样,在过去一年里深度使用过 Claude Code、Cursor 或者 GitHub Copilot,那你一定经历过这种场景:AI 助手噼里啪啦生成了一大堆看起来非常酷炫的代码,你兴…...
基于Azure SQL与Semantic Kernel的RAG应用实战:低成本实现向量搜索与智能问答
1. 项目概述:当SQL数据库遇上向量搜索如果你正在用.NET技术栈构建智能应用,并且数据已经躺在Azure SQL Database里,那么“如何低成本、高效率地实现语义搜索和RAG(检索增强生成)”很可能就是你当前最头疼的问题。传统的…...
滑块验证码的轨迹反欺诈:从原理到QCaptcha企业级防护实战
摘要:本文深度剖析滑块验证码的反欺诈技术,从第一代纯位移校验到第三代复合验证的演进过程。重点讲解QCaptcha平台如何通过前端SDK内置轨迹采集后端票据校验实现企业级防护,并提供不同场景的配置建议和实测数据对比。一、黑产自动化攻击现状在…...
基于Tauri框架构建轻量级ChatGPT桌面客户端:从原理到实践
1. 项目概述:一个基于Tauri的ChatGPT桌面客户端 最近在折腾AI应用本地化部署的时候,发现了一个挺有意思的项目: pljhonglu/ChatGPT-T 。这是一个用Tauri框架开发的ChatGPT桌面客户端,它的前端界面直接复用了开源项目 chatgpt-…...
从零构建高效项目脚手架:自动化项目初始化与最佳实践
1. 项目概述:一个为开发者准备的“瑞士军刀”式工具集最近在GitHub上闲逛,发现了一个挺有意思的项目,叫jpKuji/clawstrate。乍一看这个名字,有点摸不着头脑,既不像常见的框架名,也不像某个具体的应用。点进…...
AI 驱动单元测试生成:智能优先级与自动化验证实践
1. 项目概述如果你和我一样,长期在维护一个中大型的 TypeScript 项目,那么“补单元测试”这件事,大概率是你技术债清单上那个永远在滚动、却很少被真正划掉的任务。手动写测试枯燥耗时,尤其是面对那些遗留的、逻辑复杂的业务函数时…...
构筑数字韧性:从零信任到内生安全,打造面向未来的数字基础设施
1. 从一篇行业评论引发的深度思考:我们该如何构筑数字时代的“安全地基”?前几天,行业媒体EE Times上的一篇旧文被重新翻了出来,标题挺抓人眼球,大致是在讨论某个国家在关键技术领域的主导地位是否面临挑战。抛开其中地…...
Cap框架解析:模块化开发者工具箱的设计哲学与核心实践
1. 项目概述:一个面向开发者的现代化软件工具箱最近在GitHub上看到一个挺有意思的项目,叫“CapSoftware/Cap”。乍一看这个名字,可能会联想到“Cap”这个英文单词的多种含义——帽子、上限、或者电容的单位。但在软件开发的语境里,…...
C语言指针:从零掌握指针(5) 完结篇
文章目录C语言指针:从零掌握指针(5) 完结前言一、回调函数1.1 什么是回调函数?1.2 使用回调函数二、qsort函数2.1 qsort基础2.2 排序整形数据2.3 排序浮点型数据2.4 排序结构数据三,qsort函数模拟实现C语言指针&#x…...
告别底噪与失真:手把手教你用STM32 I2C驱动WM8988音频Codec(附完整寄存器配置代码)
嵌入式音频开发实战:WM8988音质优化全攻略 在嵌入式音频系统开发中,WM8988作为一款高性能低功耗的音频编解码芯片,因其出色的音质表现和灵活的配置选项,成为众多开发者的首选。然而,很多工程师在完成基础驱动后&#x…...
