当前位置: 首页 > news >正文

设计者模式之访问者模式

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{@Overridepublic 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{@Overridepublic 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)运行结果

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【3.8】贪心算法-解无重叠区间
  • 微服务日常总结
  • GitLab 是什么?GitLab使用常见问题解答
  • Spring Boot实现文件上传和下载
  • 学生宿舍限电模块具体规格如何选择?
  • 线性代数 第三讲 线性相关无关 线性表示
  • 1、.Net UI框架:Avalonia UI - .Net宣传系列文章
  • 面试题总结(二) -- 面向对象篇(封装、继承、多态)
  • BaseCTF之web(week2)
  • [Linux] 操作系统 入门详解
  • element-ui单元格点击后进入编辑模式的功能
  • SpringBoot使用入门
  • 【安全漏洞】SpringBoot + SpringSecurity CORS跨域资源共享配置
  • Chrome 浏览器插件获取网页 window 对象(方案一)
  • Java 入门指南:Java NIO —— Buffer(缓冲区)
  • 03Go 类型总结
  • 0x05 Python数据分析,Anaconda八斩刀
  • 30秒的PHP代码片段(1)数组 - Array
  • Android优雅地处理按钮重复点击
  • crontab执行失败的多种原因
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • js数组之filter
  • node.js
  • php ci框架整合银盛支付
  • Python_网络编程
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 简单实现一个textarea自适应高度
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 数组大概知多少
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 一起参Ember.js讨论、问答社区。
  • 栈实现走出迷宫(C++)
  • kubernetes资源对象--ingress
  • 正则表达式-基础知识Review
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​字​节​一​面​
  • #define与typedef区别
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (回溯) LeetCode 78. 子集
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .Net 基于MiniExcel的导入功能接口示例
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .Net程序帮助文档制作
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .NET中winform传递参数至Url并获得返回值或文件
  • .vue文件怎么使用_vue调试工具vue-devtools的安装