设计模式之访问者模式笔记

news2025/1/10 10:43:49

设计模式之访问者模式笔记

  • 说明
  • Iterator(访问者)
  • 目录
  • 访问者模式示例类图
    • 抽象访问者角色类
    • 抽象元素角色类
    • 宠物猫类
    • 宠物狗类
    • 自己类
    • 其他人类
    • 家类
    • 测试类

说明

记录下学习设计模式-访问者模式的写法。JDK使用版本为1.8版本。

Iterator(访问者)

意图:表示一个作用于某对象结构中的各元素的操作。它允许在不改变各元素的类的前提下定义这些元素的新操作。
结构:
在这里插入图片描述

其中:

  • Visitor(访问者)为该对象结构中 ConcreteElement 的每一个类声明一个 Visit操作。该操作的名字和特征标识了发送 Visit 请求给该访问者的那个类,这使得访问者可以确定正被访问元素的具体的类。这样访问者就可以通过该元素的特定接口直接访问它。
  • ConcreteVisitor (具体访间者)实现每个有 Visitor 声明的操作,每个操作实现本算法的一部分,而该算法片段乃是对应于结构中对象的类。ConcreteVisitor 为该算法提供了上下文并存储它的局部状态。这一状态常常在遍历该结构的过程中累积结果。
  • Element(元素)定义以一个访间者为参数的 Accept 操作。
  • ConcreteElement (具体元素)实现以一个访问者为参数的Accept 操作。
  • ObjcctStructure (对象结构)能枚举它的元素,可以提供一个高层的接口以允许该访问者访问它的元素;可以是一个组合或者一个集合,如一个列表或一个无序集合。

适用性:

  • 对象结构相对稳定,但其操作算法经常变化的程序。
  • 对象结构中的对象需要提供多种不同且不相关的操作,而且要避免让这些操作的变化影响对象的结构。

目录

在这里插入图片描述

访问者模式示例类图

在这里插入图片描述在这里插入图片描述
以该UML类图实现访问者模式示例。

抽象访问者角色类

package com.example.deesign_patterns.visitor;

//抽象访问者角色类
public interface Person {

    //喂食宠物猫
    void feed(Cat cat);

    //喂食宠物狗
    void feed(Dog dog);
}

抽象元素角色类

package com.example.deesign_patterns.visitor;

//抽象元素角色类
public interface Animal {

    //接受访问者访问的功能
    void accept(Person person);
}

宠物猫类

package com.example.deesign_patterns.visitor;

//宠物猫类,具体元素角色类
public class Cat implements Animal{

    @Override
    public void accept(Person person) {
        person.feed(this);//访问者给宠物猫喂食
        System.out.println("好好吃,喵喵喵。。。");
    }
}

宠物狗类

package com.example.deesign_patterns.visitor;

//宠物狗类,具体元素角色类
public class Dog implements Animal{

    @Override
    public void accept(Person person) {
        person.feed(this);//访问者给宠物狗喂食
        System.out.println("好好吃,汪汪汪。。。");
    }
}

自己类

package com.example.deesign_patterns.visitor;

//自己类,具体访问者角色类
public class Owner implements Person{

    @Override
    public void feed(Cat cat) {
        System.out.println("主人喂食猫");
    }

    @Override
    public void feed(Dog dog) {
        System.out.println("主人喂食狗");
    }
}

其他人类

package com.example.deesign_patterns.visitor;

//其他人类,具体访问者角色类
public class Someone implements Person{

    @Override
    public void feed(Cat cat) {
        System.out.println("其他人喂食猫");
    }

    @Override
    public void feed(Dog dog) {
        System.out.println("其他人喂食狗");
    }
}

家类

package com.example.deesign_patterns.visitor;

import java.util.ArrayList;
import java.util.List;

//家类,对象结构类
public class Home {

    //声明一个集合对象,用来存储元素对象
    private List<Animal> nodeList=new ArrayList<Animal>();

    //添加元素功能
    public void add(Animal animal){
        nodeList.add(animal);
    }

    public void action(Person person){
        //遍历集合,获取每一个元素,让访问者访问每一个元素
        for(Animal animal:nodeList){
            animal.accept(person);
        }
    }
}

测试类

package com.example.deesign_patterns.visitor;

//测试类
public class Client {

    public static void main(String[] args) {
        //创建Home对象
        Home home=new Home();
        //添加元素到Home对象中
        home.add(new Cat());
        home.add(new Dog());
        //创建主人对象
        Owner owner=new Owner();
        //让主人喂食所有宠物
        home.action(owner);
        //创建其他人对象
        Someone someone=new Someone();
        //让其他人喂食所有宠物
        home.action(someone);
    }
}

在这里插入图片描述

好处:

  • 扩展性好。在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。
  • 复用性好。通过访问者来定义整个对象结构通用的功能,从而提高复用程度。
  • 分离无关行为。通过访问者来分离无关的行为,把相关的行为封装在一起,构成一个访问者,这样每一个访问者的功能都比较单一。

缺点:

  • 对象结构变化很困难。在访问者模式中,每增加一个新的元素类,都要在每一个具体访问者类中增加相应的具体操作,这违背了“开闭原则”。
  • 违反了依赖倒置原则。访问者模式依赖了具体类,而没有依赖抽象类。

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

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

相关文章

平面设计师实习报告范文十篇

平面设计师实习报告范文1 经过了四年的系统性理论学习&#xff0c;使我对平面设计有了基本掌握&#xff0c;对于平面设计这个专业也有了一个系统的了解和掌握。我们即将离开大学校园&#xff0c;作为平面设计专业的毕业生&#xff0c;心中想得更多的是如何去做好一个平面设计师…

ETCD集群运维

ETCD集群运维 ETCD扩容节点ETCD参数调优时间参数快照磁盘网络 监控维护压缩历史版本消除碎片化存储配额快照备份 灾难恢复快照恢复 etcd gateway作用什么时候不应该使用网关启动方式 gRPC代理可扩展的watch API租约请求缓存启动gRPC代理 ETCD扩容节点 节点1&#xff1a;10.1.1…

管理类联考——逻辑——知识篇——论证推理——一、削弱——haimian

削弱 考点分析 削弱 年度 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023题量223262132 主要问法 以下哪项如果为真&#xff0c;则能最严重地削弱&#xff08;反驳&#xff09;上述结论?以下哪项如果为真&#xff0c;则最能削弱&#xff08;反驳&#xff09…

文心一言 VS 讯飞星火 VS chatgpt (46)-- 算法导论6.1 4题

四、假设一个最大堆的所有元素都不相同&#xff0c;那么该堆的最小元素应该位于哪里? 文心一言&#xff1a; 最大堆的最小元素位于堆的根结点。由于最大堆的性质&#xff0c;根结点是堆中所有元素的最大值&#xff0c;因此它也是堆中所有元素的最小值。 讯飞星火&#xff1a…

工具及方法 - 如何进行任务管理

如何做好你该做的事&#xff0c;这是你的一生之敌。 没有一步到位的工具和一劳永逸的方法&#xff0c;只有不断变化的需求和自己用起来顺手的感觉。 对于GTD工具&#xff0c;在手机上安装过番茄工作法的工具&#xff0c;在电脑的Excel上也做过任务列表&#xff0c;在免费的项目…

解决 kali换源之后签名无效

报错问题&#xff1a; apt-get update 报错 更新扩展知识&#xff1a;kali更新源 终端输入 vi /etc/apt/sources.list #中科大 deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main …

计算机视觉中,有哪些基于控制点对的图像变换?

这里探讨的所有图像变换&#xff08;二维&#xff09;都是基于控制点对的&#xff0c;它们的主要区别在于&#xff1a; 1、它们是如何通过两张图像的控制点对产生变换场&#xff08;变换矩阵或者变换公式中的参数&#xff09;的 2、控制点之间的对应关系严格程度 这里说的变换…

远心镜头案例锦集

远心镜头&#xff08;Telecentric lens&#xff09; 定义&#xff1a;远心镜头是一类将其入瞳或出瞳放置于无穷远的光学系统。是为纠正传统镜头视差而设计&#xff0c;它可以在一定的物距范围内&#xff0c;使得到的图像放大倍率不会变化&#xff0c;即这种镜头拍出来的图像没…

人工智能(4):模型评估

模型评估是模型开发过程不可或缺的一部分。它有助于发现表达数据的最佳模型和所选模型将来工作的性能如何。 按照数据集的目标值不同&#xff0c;可以把模型评估分为分类模型评估和回归模型评估。 1 分类模型评估 准确率 预测正确的数占样本总数的比例。 其他评价指标…

嵌入式C开发 VS 嵌入式CPP开发!

目录 ​答主&#xff1a;听心跳的声音 答主&#xff1a;pansz 答主&#xff1a;candy 这是知乎嵌入式领域的一个热门话题&#xff0c;原文链接&#xff1a; https://www.zhihu.com/question/374663834 几个高赞回答&#xff1a; ​答主&#xff1a;听心跳的声音 单片机的主…

多项式回归的原理及实现、多重回归的原理

1.多项式回归的原理及实现 笔记来源于《白话机器学习的数学》 1.1 多项式回归的原理 预测一个变量 x x x与一个变量 y y y的关系 例如&#xff1a;广告费 x x x与点击量 y y y 用曲线拟合数据 求导过程类比本人之前的博客进行推导&#xff0c;相关笔记&#xff1a;最小二乘法的…

Nginx基于授权的访问控制步骤

目录 一、安装httpd-tools 二、生成用户密码认证文件 三、修改主配置文件相对应的目录&#xff0c;添加认证配置置顶 四、 重启服务 五、 访问网址 一、安装httpd-tools 二、生成用户密码认证文件 三、修改主配置文件相对应的目录&#xff0c;添加认证配置置顶 Vim /usr/loc…

【雕爷学编程】Arduino动手做(124)---24位WS2812环形灯板

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

tensorflow2模型保存和恢复

有两种方法可以保存模型&#xff1a; 使用检查点&#xff0c;一种简单的在硬盘上保存变量的方法使用SavedModel&#xff0c;模型结构及检查点 检查点不包含任何关于模型自身的描述&#xff1a;它们只是一种简单的存储参数并能让开发者正确恢复它的方法。 SavedModel格式在保…

Mysql复习多表查询

Mysql复习多表查询 1.多表关系2.多表查询概述3.内连接4. 外连接5. 自连接5.1 案例 6. 子查询6.1 标量子查询6.1.1 标量子查询案例 6.1 列子查询6.2 行子查询6.2.1 demo1 6.3 表子查询6.3.1 demo16.3.2 demo2 7.联合查询8.1 案例 附录 1.多表关系 >多表查询 项目开发中&…

【算法】代码随想录、数组——长度最小的子数组、滑动窗口实现

209.长度最小的子数组 解法思想来自代码随想录&#xff1a;209.长度最小的子数组 &#xff08;1&#xff09;暴力解法 我们暴力解法直接使用两个for循环&#xff0c;然后不断的遍历寻找符合条件的子序列&#xff1b; 初始化长度变量length和结果变量result为0和int类型最大数…

近期离职心情记录 大不了前端换行!

提了离职了&#xff0c;发消息给领导的时候我都不敢看&#xff0c;发了马上关闭了聊天框当乌龟。。。 一、大致背景介绍 现在在二线城市的上市公司&#xff0c;本人大专学历&#xff0c;学的是java&#xff08;甚至还报名了培训班&#xff09;。第一个公司是现在公司的外包公司…

管理类联考——逻辑——知识篇——论证推理——七、论证方式——haimian

论证方式 考点分析 削弱 年度 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023题量211111 题型分类 关键问题 题型特征 典型问法&#xff1a; 为了评价上述论证的正确性&#xff0c;回答以下哪个问题最为重要以下哪项对于评价上述结论最为重要? 思路点拨…

【IMX6ULL驱动开发学习】10.设置uboot使用网络加载zImage和dtb

1. 在uboot中设置网络 首先启动自己的板子&#xff0c;使用 ifconfig 命令或者 ifconfig -a 命令查看自己网卡的地址 ifconfig ifconfig -a我的网卡地址是这个 52:15:66:2E:16:71接着设置自己的ip setenv ipaddr 192.168.1.100设置服务器ip setenv serverip 192.168.1.200保…

如何系列 如何在单机和集群环境保证代码线程安全

文章目录 什么是线程安全什么场景下会发生如何保证线程安全单机环境1.无状态设计2.使用final关键字&#xff08;不可变&#xff09;3.使用synchronized关键字4.使用volatile关键字5.使用java.util.concurrent.atomic包中的原子包装类6.使用java.util.concurrent.locks包中的锁7…