设计模式 - 访问者模式

目录

一. 前言

二. 实现

三. 优缺点


一. 前言

    访问者模式,即在不改变聚合对象内元素的前提下,为聚合对象内每个元素提供多种访问方式,即聚合对象内的每个元素都有多个访问者对象。访问者模式主要解决稳定的数据结构和易变元素的操作之间的耦合问题。

二. 实现

Visitor:访问者,为每一个 ConcreteElement 声明一个 visit 操作。
ConcreteVisitor:具体访问者,存储遍历过程中的累计结果。
ObjectStructure:对象结构,可以是组合结构,或者是一个集合。

public interface Element {void accept(Visitor visitor);
}public class Customer implements Element {private String name;private List<Order> orders = new ArrayList<>();Customer(String name) {this.name = name;}String getName() {return name;}void addOrder(Order order) {orders.add(order);}public void accept(Visitor visitor) {visitor.visit(this);for (Order order : orders) {order.accept(visitor);}}
}public class Order implements Element {private String name;private List<Item> items = new ArrayList();Order(String name) {this.name = name;}Order(String name, String itemName) {this.name = name;this.addItem(new Item(itemName));}String getName() {return name;}void addItem(Item item) {items.add(item);}public void accept(Visitor visitor) {visitor.visit(this);for (Item item : items) {item.accept(visitor);}}
}public class Item implements Element {private String name;Item(String name) {this.name = name;}String getName() {return name;}public void accept(Visitor visitor) {visitor.visit(this);}
}
class CustomerGroup {private List<Customer> customers = new ArrayList<>();void accept(Visitor visitor) {for (Customer customer : customers) {customer.accept(visitor);}}void addCustomer(Customer customer) {customers.add(customer);}
}
public interface Visitor {void visit(Customer customer);void visit(Order order);void visit(Item item);
}
public class GeneralReport implements Visitor {private int customersNo;private int ordersNo;private int itemsNo;public void visit(Customer customer) {System.out.println(customer.getName());customersNo++;}public void visit(Order order) {System.out.println(order.getName());ordersNo++;}public void visit(Item item) {System.out.println(item.getName());itemsNo++;}public void displayResults() {System.out.println("Number of customers: " + customersNo);System.out.println("Number of orders:    " + ordersNo);System.out.println("Number of items:     " + itemsNo);}
}
public class Client {public static void main(String[] args) {Customer customer1 = new Customer("customer1");customer1.addOrder(new Order("order1", "item1"));customer1.addOrder(new Order("order2", "item1"));customer1.addOrder(new Order("order3", "item1"));Order order = new Order("order_a");order.addItem(new Item("item_a1"));order.addItem(new Item("item_a2"));order.addItem(new Item("item_a3"));Customer customer2 = new Customer("customer2");customer2.addOrder(order);CustomerGroup customers = new CustomerGroup();customers.addCustomer(customer1);customers.addCustomer(customer2);GeneralReport visitor = new GeneralReport();customers.accept(visitor);visitor.displayResults();}
}
customer1
order1
item1
order2
item1
order3
item1
customer2
order_a
item_a1
item_a2
item_a3
Number of customers: 2
Number of orders:    4
Number of items:     6

三. 优缺点

优点
1. 符合单一职责原则,即数据的存储和操作分别由对象结构类和访问者类实现。
2. 优秀的扩展性和灵活性。
缺点
1. 具体元素对访问者公布了其细节,违反了迪米特法则。
2. 具体元素的增加将导致访问者类的修改,违反了开闭原则。
3. 访问者类依赖了具体类而不是抽象,违反了依赖倒置原则。

JDK中的访问者模式
javax.lang.model.element.Element and javax.lang.model.element.ElementVisitor
javax.lang.model.type.TypeMirror and javax.lang.model.type.TypeVisitor

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

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

相关文章

Unity实现设计模式——策略模式

Unity实现设计模式——策略模式 策略模式是一种定义一些列算法的方法&#xff0c;这些所有的算法都是完成相同的工作&#xff0c;只是实现不同。它可以通过相同的方式调用所有的算法&#xff0c;减少各种算法类与使用算法类之间的耦合。 策略模式的 Strategy 类层次为 Contex…

【Qt控件之QPushButton】使用及技巧

描述 QPushButton类是Qt中用于创建按钮的控件类&#xff0c;它继承自QAbstractButton类。 下面是QPushButton类的一些主要函数说明&#xff1a; QPushButton(QWidget *parent nullptr)&#xff1a;构造函数&#xff0c;创建一个QPushButton对象。 explicit QPushButton(cons…

放大招,百度文心大模型4.0正在加紧训练,即将发布

插播一条快讯&#xff01; &#xfeff;&#xfeff;刚刚看到一篇报道&#xff0c;说百度正在加紧训练文心大模型4.0&#xff01;百度5月发布了文心大模型3.5&#xff0c;才4个多月又要发布4.0了&#xff0c;这迭代速度简直了。据说这次发布将在10月17日百度世界大会上进行&am…

面试题-React(十):setState为什么使用异步机制?

在React中&#xff0c;setState的异步特性和异步渲染机制是开发者们经常讨论的话题。为什么React选择将setState设计为异步操作&#xff1f;异步渲染又是如何实现的&#xff1f;本篇博客将深入探究这些问题&#xff0c;通过代码示例解释为什么异步操作是React的一大亮点。 一、…

NeurIPS 2023 | 李飞飞团队提出SiamMAE:孪生掩码自编码器,刷榜视觉自监督方法

在计算机视觉领域&#xff0c;想要建立图像和场景&#xff08;scene&#xff09;之间之间的对应关系是一项比较困难的任务&#xff0c;尤其是在存在遮挡、视角改变或是物体外观发生变化的情况下。 最近&#xff0c;斯坦福大学李飞飞团队对MAE进行扩展&#xff0c;提出了孪生掩…

Tensorflow入门之 Hello World

Tensorflow入门之 Hello World 简介 Tensorflow 是 Google 开源的深度学习框架&#xff0c;来自于 Google Brain 研究项目&#xff0c;在 Google 第一代分布式机器学习框架 DistBelief 的基础上发展起来。 Tensorflow 的官方网址 http://www.tensorflow.org Tensorflow 的 G…

基于边缘网关的智慧工地监测方案

边缘物联网技术为千行百业赋能&#xff0c;依托边缘计算的低延时、高效率、广适用优势&#xff0c;也为工程建设产业带来新的增长动力。 例如在智慧工地应用中&#xff0c;围绕建设施工过程中的人员、设备、环境等要素&#xff0c;利用边缘计算网关构建全面的数据采集、分析、联…

web3.0时代分布式网络协议的异同

Web3.0时代标志着分布式网络协议的兴起&#xff0c;其中IPFS&#xff08;InterPlanetary File System&#xff09;和NDN&#xff08;Named Data Networking&#xff09;是备受瞩目的项目。尽管它们都属于分布式网络协议领域&#xff0c;但在多个方面存在显著区别。以下是IPFS和…

电子元器件选型与实战应用—05 电容选型第2篇

文章目录 1. 铝电解电容1.1 介绍1.2 铝电解电容优缺点2. 钽电容2.1 介绍2.2 钽电容优缺点3. 三个电容之间对比3.1 温度特性对比3.2 偏压特性对比3.3 ESR-频率曲线4. 电容类型选择5. 电容封装选择前文推荐: 电子元器件选型与实战应用—04 LDO选型、特性及应用电子元器件选型与实…

WebSocket ----苍穹外卖day8

介绍 实现步骤 各个模块详解 OnOpen OnOpen:标记一个方法作为处理WebSocket连接打开的方法 当一个客户端与服务器建立 WebSocket 连接时&#xff0c;服务器会接收到一个连接请求。一旦服务器接受了这个连接请求&#xff0c;一个 WebSocket 连接就会被建立。这时&#xff0c;被…

SpringMVC中异常处理详解

单个控制器异常处理 // 添加ExceptionHandler&#xff0c;表示该方法是处理异常的方法&#xff0c;属性为处理的异常类ExceptionHandler({java.lang.NullPointerException.class,java.lang.ArithmeticException.class})public String exceptionHandle1(Exception ex, Model mo…

Android kotlin内联函数(inline)的详解与原理

一、介绍 在kotlin中&#xff0c;有一种函数叫内联函数&#xff0c;这种函数标识符是inline&#xff0c;但是好多人对这个函数的理解只停留在八股文中&#xff0c;内容函数的用法和普通函数没有区别&#xff0c;但是在编译原理上是有&#xff0c;对程序的性能有一定的影响。 二…

wpf中prism框架

安装prism包&#xff1a; 添加引用 using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Linq; using System.Threading.Tasks; using System.Windows; using Prism.DryIoc; using Prism.Ioc;namespace PrismDemo …

【2023年11月第四版教材】第21章《项目管理科学基础》(合集篇)

第21章《项目管理科学基础》(合集篇) 1 章节内容2 工程经济学3 运筹学1 章节内容 【本章分值预测】和之前教材内容一样,有部分新增内容,预计选择题考4-5分,案例和论文本次考试预计不考;3次运筹学计算题课程和计算专题9需要认真学习一下! 2 工程经济学 财务方面三个主要…

【Amazon】基于AWS云实例(CentOS 7.9系统)使用kubeadm方式搭建部署Kubernetes集群1.25.4版本

文章目录 前言实验架构介绍K8S集群部署方式说明使用CloudFormation部署EC2实例集群环境准备修改主机名并配置域名解析&#xff08;ALL节点&#xff09;禁用防火墙禁用SELinux加载br_netfilter模块安装ipvs安装 ipset 软件包同步服务器时间关闭swap分区安装Containerd 初始化集群…

Flutter_Slider_SliderTheme_滑杆/滑块_渐变色

调用示例以及效果 SliderTheme(data: SliderTheme.of(context).copyWith(trackHeight: 3,// 滑杆trackShape: const GradientRectSliderTrackShape(radius: 1.5),// 滑块thumbShape: const GradientSliderComponentShape(rectWH: 14, overlayRectSpace: 4, overlayColor: Colou…

数据采集时使用HTTP代理IP效率不高怎么办?

目录 前言 一. 测试代理IP速度 二. 调整连接池大小 三. 多线程并发采集 四. 选择稳定的代理服务商 总结 前言 数据采集作为爬虫的重要环节之一&#xff0c;常常会遇到反爬虫的机制&#xff0c;封禁IP等等问题。为了规避这些问题&#xff0c;我们可以使用HTTP代理IP来进行…

react中预览excel表格

查了很多资料&#xff0c;很多插件&#xff0c;有很多也用不了&#xff0c;最后试了xlsx这个插件&#xff0c;可以使用。 话不多少了&#xff0c;直接放代码吧&#xff1a; 1.代码实现 fetch(API).then((res: any) > {res?.blob().then((r: any) > {const reader ne…

Haar cascade+opencv检测算法

Harr特征识别人脸 Haar cascade opencv步骤 读取包含人脸的图片使用haar模型识别人脸将识别的结果用矩形框画出来 构造haar检测器 &#xff1a;cv2.CascadeClassifier(具体检测模型文件) # 构造Haar检测器 # 级联分级机,cv2.CascadeClassifier():cv2的内置方法&#xff0…