设计者模式之访问者模式

news2024/9/28 13:22:02

1.访问者模式概述

        允许你在不改变对象结构中的元素类的前提下,向对象结构中的元素增加新的行为。这种模式将数据结构与作用于结构上的操作分离,从而使得我们可以独立地改变数据结构和操作


2.访问者模式的组成部分

1)Visitor(访问者)

        定义了一个访问每个元素的接口,包含多个访问方法,每个方法对应一种具体的元素类型。


2)Element(元素)

        定义了一个接受(accept)操作,它以一个访问者为参数。


3)ConcreteElement(具体元素)

        实现了Element接口提供的accept操作。
        每个具体元素都实现了自己的业务逻辑。


4)ObjectStructure(对象结构)


        包含一个或多个元素对象。
        提供一个高层接口,允许访问者访问这些元素。

3.举个栗子

小久玩英雄联盟的时候,使用电脑自带触摸板控制角色移动特别不爽,于是买了一个鼠标,通过笔记本电脑的usb接口插入鼠标的插头,不通过笔记本自带的触摸板玩游戏,通过鼠标玩游戏(visitor),玩的特别舒服.

注:控制鼠标移动不是通过笔记本的触摸面板(ObjectStructure),而是通过外部的鼠标(visitor)进行移动.

流程

鼠标==>鼠标插头==》通过usb接口连接电脑===>访问控制电脑屏幕中的鼠标

4.代码实现

1)  USBPlug类

package org.xiji.visitor3;

/**
 * USB插头
 */
public interface USBPlug {
    /**
     * 定义电脑的UsePort
     */
    public void acceptUsb(Computer usbPort);

}

2)UsbPort类

package org.xiji.visitor3;

/**
 * Usb接口 相当于元素接口
 */
public interface UsbPort {

    /**
     * 接受UsbPlug插头
     */
    public void acceptUsb(USBPlug usbPlug);
}

3)电脑类

package org.xiji.visitor3;

public class Computer implements UsbPort{
    @Override
    public void acceptUsb(USBPlug usbPlug) {
        usbPlug.acceptUsb(this);
    }
    public String moveMouse() {
        System.out.println("鼠标移动了");
        return "鼠标";
    }
}

4)鼠标类

package org.xiji.visitor3;

/**
 * 电脑鼠标插入usb接口
 */
public class Mouse implements USBPlug{
    @Override
    public void acceptUsb(Computer usbPort) {
        System.out.println("鼠标插入usb接口");

        System.out.println("Mouse正在移动"+ usbPort.moveMouse());
    }
}

5)visitor测试类

package org.xiji.visitor3;

public class Visitor3Main {
    public static void main(String[] args) {
        /**
         * 一台电脑
         */
        Computer computer = new Computer();
        /**
         * 新买的鼠标
         */
        Mouse mouse = new Mouse();
        /**
         * 鼠标插入到电脑,并且开始游戏
         */
        computer.acceptUsb(mouse);
    }
}

6)运行结果

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

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

相关文章

Mysql基础练习题 595.大的国家 (力扣)

如果一个国家满足下述两个条件之一,则认为该国是 大国 : 面积至少为 300 万平方公里(即,3000000 km2),或者 人口至少为 2500 万(即 25000000) 编写解决方案找出 大国 的国家名称、…

可视耳勺有没有实用性?揭露五大隐患套路!

随着科技的进步,很多人着重关注自己的个护健康,传统挖耳勺的盲目操作引起鼓膜受损的操作屡见不鲜,很多人摈弃传统挖耳勺,选择了更加直观挖耳的可视耳勺,它能通过高清内窥镜进入耳朵实时反映耳道的情况,受到…

无人机飞手执照,合法飞行不得不考的证

无人机飞手执照(也称为民用无人驾驶航空器系统驾驶员合格证或遥控航空模型飞行员执照)在特定情况下是合法飞行所必需的。以下是关于无人机飞手执照的详细解答: 一、无人机飞手执照的必要性 1. 法规要求:根据《民用无人驾驶航空器…

【安当产品应用案例100集】013-安当透明加密组件实现企业网盘数据安全存储

企业数据存储是企业运营中一个复杂关键的过程,它涉及多个方面,包括选择合适的存储解决方案、实施数据备份与恢复策略、确保数据安全以及优化存储性能等。 本案例中,我们将以企业网盘文件存储和共享为例,介绍一下办公场景和出差场…

html2canvas、pdf-lib、file-saver将html页面导出成pdf

html2canvas、pdf-lib、file-saver将html页面导出成pdf 项目背景 需要根据用户的账号信息,生成一个pdf报告发给客户,要求报告包含echart饼图、走势图等。 方案 使用html2canvas,将页面转成图片,再通过pdf-lib将图片转成pdf文件…

食家巷一窝丝:匠心传承的美味传奇

在美食的广袤天地中,有一种独特的存在 —— 食家巷一窝丝。它不仅仅是一道美食,更是一种文化的传承,一段历史的记忆。食家巷一窝丝,以其精湛的制作工艺和独特的口感令人陶醉。每一根丝都细如发丝,均匀整齐,…

基于CW2217B的库仑计硬件设计

一、CW2217简介: CW2217B是一款适用于穿戴设备的超低功耗锂电池电量计芯片。芯片监测电池在充放电状态下的电压,电流和温度,运行专利“FastCali”电量计算法,结合电池建模信息,可准确计算电池的剩余电量。CW2217B适用于包括锂锰,锂钴和聚合物等多种类型的锂电池应用。 …

fastadmin 列表显示渲染图片

想把地址显示成图片 在对应的js文件里加上这句话 formatter: Table.api.formatter.image 如果想点击图片列可以看图片的大图,则需要加上 events: Table.api.events.image 效果 Table.api.formatter Table.api.formatter封装了许多FastAdmin表格列表中常用的单元…

从入门到精通:TEMU商家如何利用自养号测评打造爆款

TEMU平台以其独特的魅力和无限潜力,吸引着众多商家竞相入驻。然而,面对激烈的市场竞争,如何快速提高销量,成为摆在每位商家面前的重大课题。本文将深入剖析一种高效且具策略性的方法——精细化自养号测评,帮助TEMU商家…

比较器(过零/非过零检测+噪声的影响+滞回+输出限幅+窗口比较器)

2024-8-30,星期五,7:25,天气:晴,心情:晴。今天周五啦,终于可以休息了,也祝大家周末快乐,玩的开心!。 今天开始了第八章基本运算放大器电路的学习&#xff0c…

Python计算机视觉 第6章-图像聚类

Python计算机视觉 第6章-图像聚类 6.1 K-means聚类 K-means 聚类 是一种常用的无监督学习算法,用于将数据集划分为 ( K ) 个簇。 算法步骤 选择 ( K ) 个初始簇中心(可以是随机选择或其他启发式方法)。将每个数据点分配到距离其最近的簇…

排查C++程序CPU异常占用方法

如果服务器资源允许可以考虑一些CPU资源占用工具,例如Perf、SystemTap。 服务器资源不允许的情况下可以使用GDB调试。 步骤如下: 1、使用top查看CPU高占用的程序,记下它的进程ID; 2、多线程服务排查时,需要排查对应…

案例分享 | Digimat应用于金属材料的仿真

Digimat——应用于金属材料的仿真 Digimat是一款专注于多尺度复合材料非线性材料本构预测和材料建模的商用软件包。Digimat能够帮助用户预测多相材料的宏观性能,支持的材料范围涉及包含连续纤维、长纤维、短纤维、纤维编织、晶须、颗粒、片层等所有增强相和包括树脂…

代理IP设置白名单:让你的网络更安全高效

在网络世界中,代理IP不仅能帮助我们提升网络速度、保护隐私,还能通过设置白名单来进一步增强网络的安全性和稳定性。本文将详细介绍代理IP设置白名单的方法和注意事项,让你在使用代理IP时更加得心应手。 什么是代理IP白名单? 代…

11款主流图纸加密软件盘点,图纸加密软件大盘点

在数字化时代,图纸作为企业核心知识产权的重要组成部分,其安全保护显得尤为重要。随着技术的发展,越来越多的图纸加密软件应运而生,为企业提供了多样化的安全解决方案。以下是11款主流图纸加密软件的详细介绍,它们各自…

Linux基础知识(一、什么是Linux)

一、Linux之父——林纳斯本纳第克特托瓦兹(Linus Benedict Torvalds) Linux操作系统最初是在1991年10月份由芬兰赫尔辛基大学的在校生Linus Torvalds所发布,最初被发布的LINUX0.02版本因其高质量的代码与开放源代码,迅速引起了一大批黑客的加…

空间旋转与四元数

参考资料:https://krasjet.github.io/quaternion/quaternion.pdf 一、二维空间与复数 已知复数 z a b i zabi zabi,我们规定其向量表示形式为 [ a b ] \left [ \begin{matrix}a\\b\end{matrix}\right ] [ab​]。我们可以将其看成是复数域的两个基底 {…

【生日视频制作】美女举牌变魔术卡牌AE模板修改文字软件生成器教程特效素材【AE模板】

美女举牌变魔术卡牌生日视频制作教程AE模板改字软件生成器素材 怎么如何做的【生日视频制作】美女举牌变魔术卡牌AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤: 安装AE软件 下载AE模板 把AE模板导入AE软件 修改图片或文字 渲染出视频

活动|华院计算惊艳亮相第十届博博会,以AI驱动数智文博

2024年8月23日至26日,第十届“中国博物馆及相关产品与技术博览会”(以下简称“博博会”)花落草原都市内蒙古自治区呼和浩特市敕勒川国际会展中心。“博博会”自2004年创办以来,已成功在多个城市举办,成为我国文博界最具…

C语言 ——— 文件的随机读写

目录 学习并使用fseek函数​编辑 学习并使用ftell函数​编辑 学习并使用rewind函数​编辑 学习并使用fseek函数 函数的功能: 根据文件指针的位置和偏移量来定位文件指针 函数的参数: FILE* stream:文件类型的指针 long int offset&am…