设计者模式之访问者模式

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

相关推荐
荣码33 分钟前
LangSmith可观测性:AI应用出bug根本不知道哪里出了问题,我踩了4个坑
java·python
十年Java程序媛1 小时前
Java 多线程基础与锁机制详解|进程线程、锁升级、synchronized 与 Lock 对比
java·开发语言·spring boot
弯_弯1 小时前
FDE 的工程能力画像:数据接入、PoC 与可复用资产的落地口径
java·服务器·开发语言
云和数据.ChenGuang2 小时前
print(f“a+b=“,result) print(f“a+b={result}“)区别
java·前端·人工智能·python·深度学习
2601_962885723 小时前
如何用 Python 算最大回撤和回撤恢复期?
java·数据库·python
代钦塔拉3 小时前
【C++/Qt 进阶】设计模式系列(4):原型模式——用“克隆“代替“重新构造“
c++·qt·设计模式
毕业设计7033 小时前
(免费领源码)SSM董家湾线上点餐系统04682- java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
java·redis·mysql·tomcat·maven·mybatis·ssm
Q26433650233 小时前
【有源码】基于SpringBoot+Vue的居民健康体检与慢病干预管理系统-面向智慧医疗的体检预约与健康知识服务平台
java·vue.js·spring boot·mysql·毕业设计·javaweb·课程设计
悠仁さん4 小时前
非类型模板参数的特化与偏特化
java·数据结构·算法