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