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