设计者模式之访问者模式

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

相关推荐
南山十一少1 小时前
Spring Security+JWT+Redis实现项目级前后端分离认证授权
java·spring·bootstrap
427724003 小时前
IDEA使用git不提示账号密码登录,而是输入token问题解决
java·git·intellij-idea
chengooooooo3 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
李长渊哦3 小时前
常用的 JVM 参数:配置与优化指南
java·jvm
计算机小白一个3 小时前
蓝桥杯 Java B 组之设计 LRU 缓存
java·算法·蓝桥杯
黑不溜秋的4 小时前
C++ 设计模式 - 策略模式
c++·设计模式·策略模式
付聪12106 小时前
策略模式介绍和代码示例
设计模式
南宫生6 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode
计算机毕设定制辅导-无忧学长6 小时前
Maven 基础环境搭建与配置(一)
java·maven
ThereIsNoCode7 小时前
「软件设计模式」状态模式(State)
设计模式·状态模式