设计者模式之访问者模式

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

相关推荐
Kali_076 分钟前
使用 Mathematical_Expression 从零开始实现数学题目的作答小游戏【可复制代码】
java·人工智能·免费
rzl0217 分钟前
java web5(黑马)
java·开发语言·前端
guojl37 分钟前
深度解读jdk8 HashMap设计与源码
java
guojl42 分钟前
深度解读jdk8 ConcurrentHashMap设计与源码
java
爱上语文1 小时前
Redis基础(5):Redis的Java客户端
java·开发语言·数据库·redis·后端
A~taoker1 小时前
taoker的项目维护(ng服务器)
java·开发语言
HGW6891 小时前
基于 Elasticsearch 实现地图点聚合
java·elasticsearch·高德地图
hi星尘2 小时前
深度解析:Java内部类与外部类的交互机制
java·开发语言·交互
wuxinyan1232 小时前
Java面试题033:一文深入了解MySQL(5)
java·数据库·mysql·面试
清心歌2 小时前
Java SE线程的创建
java