设计者模式之访问者模式

1.访问者模式概述

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

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

1)Visitor(访问者)

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

2)Element(元素)

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

3)ConcreteElement(具体元素)

实现了Element接口提供的accept操作。

每个具体元素都实现了自己的业务逻辑。

4)ObjectStructure(对象结构)

包含一个或多个元素对象。

提供一个高层接口,允许访问者访问这些元素。

3.举个栗子

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

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

流程

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

4.代码实现

1) USBPlug类

java 复制代码
package org.xiji.visitor3;

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

}

2)UsbPort类

java 复制代码
package org.xiji.visitor3;

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

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

3)电脑类

java 复制代码
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)鼠标类

java 复制代码
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测试类

java 复制代码
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)运行结果

相关推荐
沫璃染墨5 小时前
《从零入门Linux系统篇(五十六):线程篇·九——生产者消费者模型:从条件变量到BlockingQueue实现》
linux·服务器·c++·驱动开发·设计模式·架构·系统架构
code_slave(码畜)6 小时前
微服务架构落地:基础服务 —— 报表服务(上篇:定位、边界与整体架构)
java·spring boot·spring cloud·微服务·架构
不灭的黄金瞳1236 小时前
Java实现简易图书管理系统
java·intellij-idea
重生之小比特6 小时前
【C++进阶】02 Linux基本指令
java·数据库·c++
Wang's Blog6 小时前
Java 项目实战: 外卖平台优化-Nginx常用命令与环境变量配置
java·网络·nginx
sp42a6 小时前
Java 加解密组件再设计
java
FYKJ_20106 小时前
springboot家政服务平台66766-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·mysql·spark·课程设计
caoerzhong6 小时前
开源 WMS 合规交付实务:JeeWMS 仓库管理系统在 GPL-3.0 下的源码台账与交付清单
java·开源
x-Achan6 小时前
Redis实现方案:更新策略、穿透、雪崩、击穿、工具封装
java·spring boot·redis·spring·bootstrap·mybatis
蜗牛互联网6 小时前
Java 17调用gpt-transcribe实现会议录音转写与术语提示
java·人工智能·后端