【设计模式】第25节:行为型模式之“访问者模式”

一、简介

访问者模式允许一个或者多个操作应用到一组对象上,设计意图是解耦操作和对象本身,保持类职责单一、满足开闭原则以及应对代码的复杂性。

二、优点

  • 分离操作和数据结构
  • 增加新操作更容易
  • 集中化操作

三、适用场景

  • 数据结构稳定,操作易变
  • 一个对象的操作之间无关联

四、UML类图

请添加图片描述

五、案例

有圆形和矩形两种对象,有画图和调整大小两种数据访问者对形状进行处理。

package mainimport "fmt"type Shape interface {Accept(visitor Visitor)GetType() string
}type Circle struct {
}func NewCircle() *Circle {return &Circle{}
}func (c *Circle) Accept(visitor Visitor) {visitor.Visit(c)
}func (c *Circle) GetType() string {return "Circle"
}type Rectangle struct {
}func NewRectangle() *Rectangle {return &Rectangle{}
}func (r *Rectangle) Accept(visitor Visitor) {visitor.Visit(r)
}func (r *Rectangle) GetType() string {return "Rectangle"
}type Visitor interface {Visit(shape Shape)
}type DrawVisitor struct {
}func NewDrawVisitor() *DrawVisitor {return &DrawVisitor{}
}func (dv *DrawVisitor) Visit(shape Shape) {if shape.GetType() == "Circle" {fmt.Println("Drawing a circle")} else if shape.GetType() == "Rectangle" {fmt.Println("Drawing a rectangle")} else {fmt.Println("Unknown shape")}
}type ResizeVisitor struct {
}func NewResizeVisitor() *ResizeVisitor {return &ResizeVisitor{}
}func (rv *ResizeVisitor) Visit(shape Shape) {if shape.GetType() == "Circle" {fmt.Println("Resizing a circle")} else if shape.GetType() == "Rectangle" {fmt.Println("Resizing a rectangle")} else {fmt.Println("Unknown shape")}
}func main() {circle := NewCircle()rectangle := NewRectangle()drawVisitor := NewDrawVisitor()resizeVisitor := NewResizeVisitor()circle.Accept(drawVisitor)circle.Accept(resizeVisitor)rectangle.Accept(drawVisitor)rectangle.Accept(resizeVisitor)
}

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

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

相关文章

私有网络的安全保障,WorkPlus Meet内网视频会议助力企业高效会议

在企业内部沟通与协作中,视频会议成为了一种必不可少的沟通方式。然而,传统的互联网视频会议往往受制于网络不稳定因素,给企业带来不便与困扰。WorkPlus Meet作为一款专注内网视频会议的软件,致力于为企业打造高效、稳定的内网视频…

NLP实践——中文指代消解方案

NLP实践——中文指代消解方案 1. 参考项目2. 数据2.1 生成conll格式2.2 生成jsonline格式 3. 训练3.1 实例化模型3.2 读取数据3.3 评估方法3.4 训练方法 4. 推理5. 总结 1. 参考项目 关于指代消解任务,有很多开源的项目和工具可以借鉴,比如spacy的基础模…

JVM虚拟机:堆、栈、方法区的关系

本文重点 在计算机科学领域,Java虚拟机(JVM)是一个关键的概念。它是Java语言的核心,也是其他基于Java的编程语言的基础。JVM的核心组成部分包括堆、栈和方法区。这些组成部分之间的关系非常重要,因为它们共同构成了程序执行的基础。 堆:存储对象的天堂 堆是JVM中最大的…

k近邻方法处理有序型因子、无序型因子

k近邻方法处理有序型因子、无序型因子以及自己如何使用.C函数和.Call函数调用C语言 问题读源码分享有序因子和无序因子的处理有序因子的标准化问题 实现k近邻的程序包有很多:class、kknn等,但是kknn包实现了处理有序型因子和无序型因子,下面我将具体的处理方式展现给大家。…

KNN模型

使用K-Nearest Neighbors (KNN)算法进行分类。首先加载一个数据集,然后进行预处理,选择最佳的K值,并训练一个KNN模型。 # encodingutf-8 import numpy as np datas np.loadtxt(datingTestSet2.txt) # 加载数据集,返回一个numpy数…

html获取网络数据,列表展示 第二种

html获取网络数据&#xff0c;列表展示 第二种 js遍历json数组中的json对象 image.png || - 判断数据是否为空&#xff0c;为空就显示 - <!DOCTYPE html> <html><head><meta charset"utf-8"><title>网页列表</title><script …

Java作业一

编写程序实现如下界面效果&#xff1a; import java.util.Scanner;public class Test01 {public static void main(String[] args) {String name;Scanner input new Scanner(System.in);System.out.println("请输入您的姓名&#xff1a;");name input.nextLine();S…

viewfs://为Hadoop 中的一个特殊文件系统

解释 viewfs:// 是 Hadoop 中的一个特殊文件系统 URI&#xff0c;用于访问 Hadoop 的视图文件系统&#xff08;ViewFS&#xff09;。 ViewFS 是 Hadoop 提供的一种虚拟文件系统&#xff0c;它可以将来自多个底层文件系统的文件统一管理和访问。 通过 ViewFS&#xff0c;你可…

程序设计与算法(二)算法基础(北京大学MOOC)

一、枚举 1、完美立方 /* 完美立方a^3b^3c^3d^3// a大于b c d// b<c<d*/ #include <iostream> int main() {int a,b,c,d; int N 24;//scanf("%d", &N );for(a2; a<N; a ) //a的范围 [2,N]{for(b2; b<a; b){ //b的范围[2…

点云从入门到精通技术详解100篇-基于 3D 视觉信息的机械手抓取机械零部件

目录 前言 相关技术的国内外发展现状 点云配准 点云分割 点云位姿估计

R2R 的一些小tip

批次间控制器(Run-to-run Controller)&#xff0c;以应对高混合生产的挑战。将最优配方参数与各种工业特征相关联的模型是根据历史数据离线训练的。预测的最优配方参数在线用于调整工艺条件。 批次控制(R2R control)是一种先进的工艺控制技术&#xff0c;可在运行(如批次或晶圆…

HTML+CSS+JS实现计算器

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

KnowledgeGPT:利用检索和存储访问知识库上增强大型语言模型10.30

利用检索和存储访问知识库上增强大型语言模型 摘要引言2 相关研究3方法3.1 任务定义3.2 知识检索3.2.1 代码实现3.2.2 实体链接3.2.3 获取实体信息3.2.4 查找实体或值3.2.5 查找关系 3.3 知识存储 4 实验 摘要 大型语言模型&#xff08;LLM&#xff09;在自然语言处理领域展现…

Java面试基础

一、和equals 在Java中&#xff0c;使用字符串常量"a"可以直接创建一个字符串对象&#xff0c;因为Java会将所有的字符串常量都保存在一个字符串常量池中&#xff0c;如果使用相同的字符串常量创建字符串对象&#xff0c;则会指向同一个对象&#xff0c;这样就可以避…

不同源安装nginx

Nginx是一款高性能的Web服务器软件。在安装Nginx时&#xff0c;可以选择不同的安装源。 1.官方源&#xff1a;在官方网站下载Nginx的源代码&#xff0c;然后进行编译安装。 2.EPEL源&#xff1a;EPEL (Extra Packages for Enterprise Linux)源是针对Red Hat、CentOS、Scienti…

TestCenter测试管理工具

estCenter&#xff08;简称TC&#xff09;一款广受好评的测试管理工具&#xff0c;让测试工作更规范、更有效率&#xff0c;实现测试流程无纸化&#xff0c;测试数据资产化。 产品概述 TC流程图 产品功能 一、案例库 案例库集中化管理&#xff0c;支持对测试用例集中管理&…

[PHP]DBErp进销存系统 v1.1 RC 221101

DBErp系统&#xff0c;是北京珑大钜商科技有限公司 基于 Laminas doctrine 2 开发的一套进销存系统。 本系统运行环境要求&#xff1a; 服务器系统&#xff1a;Linux&#xff08;推荐&#xff09;、Unix、Windows Web服务软件&#xff1a;Apache&#xff08;推荐&#xff09;…

map和set的使用

序列式容器和关联性容器 首先序列式容器和我们之前学的线性表很相似&#xff0c;序列式容器的功能就只是单纯的储存数据。序列式容器例如&#xff1a;vactor/list/deque等等 而关联式容器则并不单纯的储存数据&#xff0c;数据之间式存在关联关系的&#xff0c;有了这个关联关…

【Redis】环境配置

环境配置 Linux版本&#xff1a; Ubuntu 22.04.2 LTS 下载redis sudo apt install redis 启动redis redis-server 输入redis-server启动redis竟然报错了&#xff0c;原因是redis已经启动&#xff0c;网上大多数的解决方案如下&#xff1a; ps -ef | grep -i redis 查询redi…

JAVA 中 Socket 和 WebSocket 区别

区别: Socket: Socket是位于java.net包下的一个类&#xff0c;是 Java 提供的用于在客户端和服务器之间建立网络通信的底层套接字接口&#xff0c;用于传输层的网络通信。 WebSocket: WebSocket 是一种基于 TCP 协议的通信协议&#xff0c;建立在 Socket 的基础上&#xff0c…