访问者模式类图与代码

某图书管理系统中管理着两种类型的文献:图书和论文。现在要求统计所有馆藏文献的总页码(假设图书馆中有一本540页的图书和两篇各25页的论文,那么馆藏文献的总页码就是590页)。采用Visitor(访问者)模式实现该要求,得到如图7.16所示的类图。

访问者模式让增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。

【Java 代码】

import java.util.*;interface Libraryvisitor {void visit(Book p_book); //访问Bookvoid visit(Article p_article);//访问 Articlevoid printSum();
}class LibrarysumPrintvisitor implements Libraryvisitor {//打印总页数private int sum = 0;public void visit(Book p_book) {sum = sum + P_book.getNumberOfPages();public void visit (Article p_article){sum = sum + p_article.getNumberOfPages0;}public void printsum () {System.out.println("SUM=" + sum);}}interface libraryItemInterface {void accept(LibraryVisitor visitor); // 声明了一个接受操作,接受一个访问者对象}class Article implements libraryItemInterface {private String m_title; //论文名private String m_author; //论文作者private intm_start_page;private int m_end_page;public Article(String p_author, string p_title, int p_start_page, intp_end_page) {m title = p title;m_author = p_author;m_end_page = p_end_page;}public int qetNumbelOfPages() {rctum m_end_page -m_start_page;}public void accept(Libraryvisitor visitor) {visitor.visit(this); // 该访问者的具体实现}}class Book implements LibraryItemInterface {private String m_title; //书名private String m_author;//书作者private intm_pages;//页教public Book(String p_author, String p_title, int p_ pages) {m_title = p_title;m_author = p_author;m_pages = p_pages;}public int getNumberOfPages() {return m_pages;}public void accept(LibraryVisitor visitor) {visitor.visit(this);// 该访问者的具体实现}}
}

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

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

相关文章

VS2015 自定义模板

VS2015 自定义模板 文章目录 VS2015 自定义模板写在前面自定义项目模板导出模板 更新模板vstemplate 文件元素修改参考 参考 写在前面 ​ VS自定义模板是为了,将一些习惯性、通用性的设置预先设置到项目中,再次创建项目时就不用重复设置相同的参数了。 …

密码知识汇总

文章目录 密码学知识CIA三要素机密性(Confidentiality)完整性(Integrity)可用性(Availability) 非安全信道的风险以及应对措施风险应对措施使用加密技术(防窃…

基于SSM+Jsp+Mysql的网络视频播放器

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包…

Leetcode面试题 01.06. 字符串压缩

Every day a Leetcode 题目来源:面试题 01.06. 字符串压缩 解法1:分组循环 分组循环统计连续字符的出现次数,构造压缩字符串,比较原字符串和压缩字符串的长度,返回长度较小的那个。 代码: class Solut…

Docker部署WebRTC-Streamer

文章目录 WebRTC-Streamer概述Docker部署WebRTC-StreamerVue使用WebRTC-Streamer一些问题 WebRTC-Streamer概述 WebRTC-Streamer是一个基于WebRTC技术的流媒体传输工具,它可以通过Web浏览器实现实时音视频流的传输和播放。它提供了一种简单而强大的方式&#xff0c…

SSRF+Redis未授权getshell

SSRFRedis未授权getshell 1.前言 当一个网站具有ssrf漏洞,如果没有一些过滤措施,比如没过滤file协议,gophere协议,dict等协议,就会导致无法访问的内网服务器信息泄露,甚至可以让攻击者拿下内网服务器权限 …

MySQL 主从复制部署(8.0)

什么是主从数据库 主从数据库是一种数据库架构模式,通常用于提高数据库的性能、可用性和可伸缩性。 它包括两种类型的数据库服务器: 1)主数据库(Master):主数据库是读写数据的主要数据库服务器。所有写操…

RobotFramework功能自动化测试框架基础篇

概念 RobotFramework是什么? Robot Framework是一款python编写的功能自动化测试框架。具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试执行。主要用于轮次很多的验收测试和验收测试…

appium driver install uiautomator2 安装失败

报错 Installing ‘uiautomator2’ using NPM install spec ‘appium-uiautomator2-driver’ Error: Encountered an error when installing package: npm command ‘install --save-dev --no-progress --no-audit --omitpeer --save-exact --global-style --no-package-lock…

网络篇12 | 链路层 ARP

网络篇12 | 链路层 ARP 01 简介1)工作过程2)ARP缓存2.1 动态ARP表项2.2 静态ARP表项2.3 短静态ARP表项2.4 长静态ARP表项 02 ARP报文格式1)ARP请求报文格式2)ARP响应报文格式3)套一层以太网帧(ARP帧&#x…

Python学习笔记25 - 一些案例

1. 输出金陵前五钗 2. 向文件输出信息 3. 打印彩色字 4. print函数、进制转换 5. 猜数游戏 6. 输出ASCII码对应的字符 7. 计算100~999之间的水仙花数 8. 千年虫数组的索引及其值 9. 星座zip dict 10. 12306车次信息 11. 字符串的格式化 12. 手动抛出异常 13. 计算圆的面积和周长…

SpringBoot 整合RocketMQ

目录 一、引入依赖 二、配置文件 三、生产者 四、消费者 五、结果 一、引入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.0</version> </d…

MYSQL09_行格式概述、变长字段、NULL值、记录头信息、真实数据、内部结构

文章目录 ①. InnoDB - 行格式概述②. 变长字段长度列表 ③. NULL值列表④. 记录头信息5字节⑤. 记录的真实数据⑥. Compact行记录的内部结构⑦. Dynamic和Compressed行格式 ①. InnoDB - 行格式概述 ①. 我们平时的数据以行为单位来向表中插入数据,这些记录在磁盘上的存放方式…

IP查询在追踪网络攻击源头中的应用

随着网络攻击事件的不断增加&#xff0c;追踪攻击源头成为网络安全领域的重要任务之一。IP查询技术通过分析网络流量中的IP地址&#xff0c;可以帮助确定攻击的来源。本文将探讨IP查询在追踪网络攻击源头中的应用&#xff0c;包括其原理、方法以及实际案例分析。 IP地址查询&a…

linux(ub)-redis环境部署

1.下载redis包 wget http://download.redis.io/releases/redis-7.0.5.tar.gz 2.解压缩&#xff1a; tar -zxvf redis-7.0.5.tar.gz 3.安装gcc&#xff1a;sudo apt-get install gcc 4. 编译&#xff1a;cd redis-7.0.5 make make make install 5. cd /usr/local/bin/ 6. mkdir …

21.5k Star , AI 智能体项目OpenDevin:少写代码,多创造(附部署教程)

Aitrainee | 公众号&#xff1a;AI进修生 这是一个旨在复制 Devin 的开源项目&#xff0c;Devin 是一位自主人工智能软件工程师&#xff0c;能够执行复杂的工程任务并在软件开发项目上与用户积极协作。该项目致力于通过开源社区的力量复制、增强和创新 Devin。 Devin 代表了一…

STK与matlab交互 Astrogator模块 (11)

一、背景知识 前面由于定轨的大作业&#xff0c;关于Astrogator模块的学习有所滞后&#xff0c;在本节将重新聚焦Astrogator模块&#xff0c;在本节中&#xff0c;首先解决的问题是已知两个卫星的轨道六根数&#xff0c;求解其中某一颗卫星LVLH坐标下另一颗卫星的位置速度。这…

一起学习python——基础篇(20)

前言&#xff0c;之前经常从网上找一些免费的接口来测试&#xff0c;有点受制于人的感觉。想了想还不如直接写一个接口&#xff0c;这样方便自己测试。自己想返回什么格式就返回什么样子&#xff0c;不用担心服务报错&#xff0c;因为自己就可以完全掌控。然后宿舍二哥告诉我py…

(四)qt中使用ffmpeg播放视频,可暂停恢复

一、在qt中添加ffmpeg库及头文件 INCLUDEPATH /usr/local/ffmpeg/include LIBS -L/usr/local/lib -lavutil -lavcodec -lavformat -lswscale 二、详细代码 FFempegVideoDecode 视频解码类&#xff08;放入线程中&#xff09; ffmpegvideodecode.h #ifndef FFMPEGVIDEODE…

NAT技术

网络技术深似海呀&#xff0c;一段时间不用又忘。 是什么 NAT技术是网络防火墙技术的一部分&#xff0c;可以作用在linux防火墙或者设备防火墙&#xff0c;NAT技术可以实现地址和端口的转换&#xff0c;主要还是为了网络连通性。 作用 存在以下三个IP&#xff0c;A(10.234.…