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

设计者模式之访问者模式

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.kler.cn/a/284124.html

相关文章:

  • androidstudio下载gradle慢
  • Spring高手之路26——全方位掌握事务监听器
  • AI大模型开发架构设计(18)——基于大模型构建企业知识库案例实战
  • 阿里云和七牛云对象存储区别和实现
  • 爱普生SG-8200CJ可编程晶振在通信设备中的应用
  • 【软件工程】一篇入门UML建模图(类图)
  • 【王树森】RNN模型与NLP应用(7/9):机器翻译与Seq2Seq模型(个人向笔记)
  • springboot读取文件
  • 高级java每日一道面试题-2024年8月31日-框架篇[Spring篇]-你对Spring事务传播机制了解多少?
  • Docker 修改镜像源
  • 利用 Web 浏览器构建 Java Media Player
  • jetsonNano烧录Ubuntu20.04镜像使用ROS2
  • 【Java设计模式】装饰器模式:动态扩展类的功能
  • Hadoop生态圈(一)
  • 《高等代数》范德蒙德行列式的证明
  • 深拷贝与浅拷贝的区别
  • 工业软件架构4:(QT和C++实现)
  • 视频和音频合成视频Easy_Wav2Lip
  • ROS - Turtle Nest 使用说明
  • 机器学习/数据分析案例---糖尿病预测
  • Java基础——IO概述
  • Java算法之快速排序(Quick Sort)
  • 服务器机柜与网络机柜的区别有哪些?
  • 耦合和内聚
  • redis集群部署
  • 集成电路学习:什么是DAC数模转换器