我用 ChatGPT 学设计模式之访问者模式

作者:明明如月学长, CSDN 博客专家,蚂蚁集团高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《EffectiveJava》独家解析》专栏作者。

热门文章推荐

  • (1)《人工智能时代,软件工程师们将会被取代?》
  • (2)《超全人工智能 AI工具导航网站合集》
  • (3)《如何写出高质量的文章:从战略到战术》
  • (4)《我的技术学习方法论》
  • (5)《什么? 你还没用过 Cursor? 智能 AI 代码生成工具 Cursor 安装和使用介绍》
  • (6)《我的性能方法论》
  • (7)《AI 时代的学习方式: 和文档对话》
  • (8)《人工智能终端来了,你还在用过时的 iterm?》
  • (9)《无需魔法打开即用的 AI 工具集锦》

一、背景

最近需要调研如何将 SQL 中的表名解析出来。
通过对 New Bing 不断提问,得知 com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser可以实现这个功能。

继续对 New Bing 进行提问,让 New Bing 帮我们写出 Demo 代码:
在这里插入图片描述

能不能使用Java 语言,借助 com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser 将下面的 SQL 中 表名 user 提取出来, SQL : select * form user where userId =10086。

New Bing 的回复:可以使用 Java 语言,借助 com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser 将 SQL 中的表名 user 提取出来。这是一个可能的代码示例:

import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
import com.alibaba.druid.sql.visitor.SchemaStatVisitor;public class Main {public static void main(String[] args) {String sql = "select * from user where userId = 10086";MySqlStatementParser parser = new MySqlStatementParser(sql);SQLStatement statement = parser.parseStatement();SchemaStatVisitor visitor = new SchemaStatVisitor();statement.accept(visitor);System.out.println(visitor.getTables().keySet()); // 输出 [user]}
}

从这份代码中我们发现, druid 中使用了访问者模来实现这部分功能。
于是,我们趁机学习一下访问者模式吧。

二、访问者模式

2.1 使用场景

访问者模式是一种行为型设计模式,它可以让你在不修改对象结构的情况下,为对象结构中的元素添加新的操作。
访问者模式的应用场景是:

  • 当你有一个复杂的对象结构(例如一个对象树),并且想在不改变这个结构的前提下,对其中的元素执行不同的操作,而且这些操作可能随着时间的推移而发生变化。
  • 当你想将一些与数据结构无关的行为封装到一个类中,而不是分散在多个类中,从而提高代码的可维护性和复用性。

一个典型的例子是 Java 的 ASM 库,它可以用来操作字节码。ASM 提供了一个抽象的访问者接口,让用户可以自定义访问者类来实现对字节码的各种操作,例如修改、增加、删除、优化等。这样,ASM 就可以保持其核心功能的稳定性,同时提供了灵活的扩展性。

2.2 代码示例

有两种类型的游戏:收费游戏和免费游戏,它们都是被访问者。
有两种类型的玩家:付费玩家和免费玩家,它们都是访问者。
不同类型的玩家对不同类型的游戏有不同的操作,例如付费玩家可以下载收费游戏,而免费玩家只能试玩收费游戏。这些操作都是通过访问者模式来实现的,代码如下:

// Game 父类 ( 被访问者 )
public abstract class Game {// 游戏名称private String name;// 游戏价格private double price;public Game(String name, double price) {this.name = name;this.price = price;}public String getName() {return name;}public double getPrice() {return price;}// 接受访问者的访问public abstract void accept(IVisitor visitor);
}// VipGame 收费游戏 ( 被访问者 )
public class VipGame extends Game {public VipGame(String name, double price) {super(name, price);}@Overridepublic void accept(IVisitor visitor) {// 调用访问者的访问方法visitor.visit(this);}
}// FreeGame 免费游戏 ( 被访问者 )
public class FreeGame extends Game {public FreeGame(String name, double price) {super(name, price);}@Overridepublic void accept(IVisitor visitor) {// 调用访问者的访问方法visitor.visit(this);}
}// IVisitor 访问者接口
public interface IVisitor {// 访问收费游戏void visit(VipGame vipGame);// 访问免费游戏void visit(FreeGame freeGame);
}// VipVisitor 付费玩家 ( 访问者 )
public class VipVisitor implements IVisitor {@Overridepublic void visit(VipGame vipGame) {System.out.println("付费玩家可以下载收费游戏:" + vipGame.getName() + ",价格为:" + vipGame.getPrice());}@Overridepublic void visit(FreeGame freeGame) {System.out.println("付费玩家可以下载免费游戏:" + freeGame.getName() + ",价格为:" + freeGame.getPrice());}
}// FreeVisitor 免费玩家 ( 访问者 )
public class FreeVisitor implements IVisitor {@Overridepublic void visit(VipGame vipGame) {System.out.println("免费玩家只能试玩收费游戏:" + vipGame.getName() + ",价格为:" + vipGame.getPrice());}@Overridepublic void visit(FreeGame freeGame) {System.out.println("免费玩家可以下载免费游戏:" + freeGame.getName() + ",价格为:" + freeGame.getPrice());}
}// 测试类
public class Test {public static void main(String[] args) {// 创建两个游戏对象Game vipGame = new VipGame("英雄联盟", 99.9);Game freeGame = new FreeGame("消消乐", 0);// 创建两个玩家对象IVisitor vipVisitor = new VipVisitor();IVisitor freeVisitor = new FreeVisitor();// 付费玩家访问两个游戏对象vipVisitor.visit(vipGame);vipVisitor.visit(freeGame);// 免费玩家访问两个游戏对象freeVisitor.visit(vipGame);freeVisitor.visit(freeGame);}
}

输出结果为:

付费玩家可以下载收费游戏:英雄联盟,价格为:99.9
付费玩家可以下载免费游戏:消消乐,价格为:0.0
免费玩家只能试玩收费游戏:英雄联盟,价格为:99.9
免费玩家可以下载免费游戏:消消乐,价格为:0.0

2.3 优、缺点

访问者模式的优点有:

  • 可以将与数据结构无关的操作封装到访问者类中,从而实现了操作和数据结构的分离,提高了代码的可维护性和复用性
  • 可以在不修改数据结构的前提下,为数据结构添加新的操作,提高了系统的扩展性
  • 可以利用双分派技术,实现多态和动态绑定

访问者模式的缺点有:

  • 增加了系统的复杂性,需要定义访问者接口和具体访问者类,以及被访问者的抽象类和具体类。
  • 违反了迪米特原则,访问者需要暴露被访问者的细节,从而降低了系统的封装性。
  • 增加了耦合,如果数据结构发生变化,需要修改所有的访问者类,降低了系统的稳定性。

四、总结

大家在日常开发中见到某种设计模式的影子时,可以去源码中学习该功能是如何使用该设计模式来实现的。主动重温该设计模式的适用场景,该设计模式的优点和缺点。这样才能够对该设计模式理解更加深刻,才更容易在未来遇到相关场景时想到该设计模式并加以致用。


创作不易,如果本文对你有帮助,欢迎点赞、收藏加关注,你的支持和鼓励,是我创作的最大动力。
在这里插入图片描述

欢迎加入我的知识星球,知识星球ID:15165241 一起交流学习。
https://t.zsxq.com/Z3bAiea 申请时标注来自CSDN。

欢迎加入我们的 slack 工作区,在里面可以对ai 和我进行提问。
https://join.slack.com/t/ai-yx51081/shared_invite/zt-1t8cp1lk3-ZMAFutZcN3PCW~8WQDGjPg

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

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

相关文章

Spring Cloud Gateway路由到Amazon S3签名失败处理

Spring Cloud Gateway路由到Amazon S3签名失败处理 背景 最近在预研统一存储网关,想到就是使用Spring Cloud Gateway作为网关的入口,再反向代理到S3对象存储服务器。 软件版本 网关:Spring Cloud Gateway 3.1.2 s3对象存储:m…

基于java(springboot)和go-cqhttp实现QQ机器人

目录 yh-qqrobot机器人简介go-cqhttp搭建1.下载应用2.生成bat文件3. 初始化项目4. 配置5. 运行项目 yh-qqrobot搭建搭建后端1. 导入sql文件2. 配置文件3. 导入到idea 搭建前端 yh-qqrobot机器人简介 yh-qqrobot是一个基于若依框和go-cqhttp集成的系统,一开始我只是揣…

【基于Flink的城市交通实时监控平台】需求一:卡口车辆超速情况检测

案例需求: 从kafka的topic-car中读取卡口数据,将超速车辆写入mysql的select * from t_speeding_info表,当通过卡口的车速超过60就认定为超速 卡口数据格式: action_time long --摄像头拍摄时间戳,精确到秒, monitor…

chatgpt赋能python:Python下载工具:提高工作效率的不二之选

Python下载工具:提高工作效率的不二之选 作为一名有10年Python编程经验的工程师,我深知一款好用的下载工具对于我们的工作效率有多么重要。因此,在众多Python工具中,我多次选用了一些好用的下载工具,并且对它们进行了…

将 ChatGLM2-6B 部署成 OpenAI API 服务

将 ChatGLM2-6B 部署成 OpenAI API 服务 0. 背景1. FastChat 部署使用 ChatGLM2-6B1-1. 创建虚拟环境1-2. 克隆代码1-3. 安装依赖库1-4. 使用 UI 进行推理1-5. 使用 OpenAI API 方式进行推理 0. 背景 最近一直在使用 OpenAI 的 API 做一些学习和调研。使用 OpenAI 的 API&…

chatgpt赋能Python-python_downloader

优秀Python下载器的重要性 在今天的数字化世界中,下载器是一个极其重要的工具。随着互联网速度的不断提升和存储设备的容量的增加,大量的数据和文件需要及时下载到本地计算机或存储设备中。许多编程语言都提供了相应的下载库,但Python是其中…

免费使用GPT-4的N种方法

很多朋友因为各种限制无法开通#ChatGPT Plus,而申请OpenAI的GPT-4 API也要慢慢排队(我的也还没下来)。于是在这里我搜集了X个可以免费使用的方法。 注:哪有什么真正免费,只不过有人在替你付钱。因此下述的方法都有限制,也有些可能会很快失效。新方法随时更新。 方法一: …

ChatGPT 拓展资料:ChatGPT插件系统上线 卷众生入局,燃天地斗气!

ChatGPT 拓展资料:ChatGPT插件系统上线 卷众生入局,燃天地斗气! ChatGPT 插件 我们已经在 ChatGPT 中实现了对插件的初步支持。插件是专门为以安全为核心原则的语言模型设计的工具,可帮助 ChatGPT 访问最新信息、运行计算或使用第三方服务。 根据我们的迭代部署理念,我们…

ChatGPT开始联网,最后的封印解除了

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2023年2月份热门报告合集 最新亲测国内可用ChatGPT使用教程(3分钟搞定) 文心一言、GPT3.5及GPT4应用测评对比报告 ChatGPT团队背景研究报告 ChatGPT的…

chatgpt最大的竞争对手-claude

介绍 Claude是Anthropic公司开发的AI聊天机器人,与ChatGPT类似,由OpenAI前副总裁创办。和虽然比不上GPT4,但在连续对话能力、写小说、编写代码、解释概念等方面表现出色。 Claude是Anthropic公司开发的大语言模型(LLM),主要特点…

巧用 ChatGPT,让开发者的学习和工作更轻松

引言 随着人工智能技术的快速发展和广泛应用,ChatGPT 作为一种新兴的自然语言处理模型,近期备受瞩目,引发了广泛讨论。 ChatGPT 具有多种应用场景,既可以用作聊天机器人,实现智能问答和自然语言交互,也可…

【promptulate专栏】使用ChatGPT和XMind快速构建思维导图

本文节选自笔者博客:https://www.blog.zeeland.cn/archives/ao302950h3j 💖 作者简介:大家好,我是Zeeland,全栈领域优质创作者。📝 CSDN主页:Zeeland🔥📣 我的博客&#…

ChatGPT常用的指令(prompts)系列十——职业顾问、私人教练、心理健康顾问

系列文章目录 内容翻译自:https://github.com/f/awesome-chatgpt-prompts,并加入自己的实践内容 1、 ChatGPT常用的提示语(prompts)系列一 2、 ChatGPT常用的提示语(prompts)系列二 3、 ChatGPT常用的提示语…

ChatGPT为什么能够火出圈

最近ChatGPT可以说是火遍了全世界,作为由知名人工智能研究机构OpenAI于2022年11月30日发布的一个大型语言预训练模型,他的核心在于能够理解人类的自然语言,并使用贴近人类语言风格的方式来进行回复。模型开放使用以来,在人工智能领…

ChatGPT为什么会一本正经胡说八道?我们如何改进它?| 文内附有代码

ChatGPT为什么会一本正经胡说八道?我们如何改进它?| 文内附有代码 众所周知,在OpenAI平台上的ChatGPT模型目前有两大痛点:1. 它所学习的数据资料都是截止到2021年为止的,因此无法给出2022年之后的发生的事情。2. 有些时…

干货!150个chatgpt指令大全!chatGPT输出结果的质量高低,和你使用什么样质量的输入内容有关。

干货!150个chatgpt指令大全 chatGPT输出结果的质量高低,和你使用什么样质量的输入内容有关。 在外网有大佬们已经整理出一些标准的问话模板,直接拿来使用后,效果极佳! 把已经过验证的优质问法可以直接拿来用&#xf…

我用 ChatGPT 干的 18 件事!

👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇 来自:CSDN,作者:ㄣ知冷煖★ 原文链接: https://blog.csdn.net/weixin_42475060/article/details/129399125 版权声明…

[Golang实战]如何快速接入chatgpt/openai?[引入go-gpt3][新手开箱可用]

如何快速接入chatgpt?[引入go-gpt3] 上文介绍了如何在网页使用chatgpt?V1.介绍下在golang中使用chatgpt?1.查看官网推荐的chatgpt项目2.访问go-gpt33.使用并运行在自己的项目中...(是因为例子很难理解,所以一一对应了属性做了配置)3.1安装项目3.2换上自己的代码3.3换上自己的…

用ChatGPT操控机器人,微软开启居家机器人新纪元!

编|LRS 源|新智元 ChatGPT不止会动嘴,还能帮你操控无人机! 虽然ChatGPT已经被调教为符合人类的偏好,但在各种反向操作下,还是能够逼问出一些「不道德的内容」,比如ChatGPT可以给你列一份详细的…

ChatGPT:微软人工智能Office和电邮即将登场...

PS:欢迎大家关注我的Twitter:Alphatu4 (深夜写稿不易,会有很多独家内容) 欢迎点击在看、转发~谢谢大家!🐇 *转载请扫码添加后台微信二维码,转载请注明来源,且附上本文的…