目录
1.访问者模式概述
允许你在不改变对象结构中的元素类的前提下,向对象结构中的元素增加新的行为。这种模式将数据结构与作用于结构上的操作分离,从而使得我们可以独立地改变数据结构和操作。
2.访问者模式的组成部分
1)Visitor(访问者)
定义了一个访问每个元素的接口,包含多个访问方法,每个方法对应一种具体的元素类型。
2)Element(元素)
定义了一个接受(accept)操作,它以一个访问者为参数。
3)ConcreteElement(具体元素)
实现了Element接口提供的accept操作。
每个具体元素都实现了自己的业务逻辑。
4)ObjectStructure(对象结构)
包含一个或多个元素对象。
提供一个高层接口,允许访问者访问这些元素。
3.举个栗子
小久玩英雄联盟的时候,使用电脑自带触摸板控制角色移动特别不爽,于是买了一个鼠标,通过笔记本电脑的usb接口插入鼠标的插头,不通过笔记本自带的触摸板玩游戏,通过鼠标玩游戏(visitor),玩的特别舒服.
注:控制鼠标移动不是通过笔记本的触摸面板(ObjectStructure),而是通过外部的鼠标(visitor)进行移动.
主要部分:
英雄联盟:这是访问者模式的元素类,它定义了接受访问者访问的方法。
屏幕上的鼠标:这是访问者模式的访问者类,它定义了访问元素的方法。
电脑:这是访问者模式的对象结构,它包含元素和访问者。
通过这种方式,访问者模式允许在不改变类层次结构的情况下,为一组类添加新的行为。
流程
鼠标==>鼠标插头==》通过usb接口连接电脑===>访问控制电脑屏幕中的鼠标
4.代码实现
1) USBPlug类
这段代码定义了一个名为 USBPlug 的接口,用于表示 USB 插头。接口中定义了一个方法 acceptUsb,用于让计算机使用该 USB 插头。
package org.xiji.visitor3;
/**
* USB插头
*/
public interface USBPlug {
/**
* 定义电脑的UsePort
*/
public void acceptUsb(Computer usbPort);
}
2)UsbPort类
这段代码定义了一个名为 UsbPort 的接口,用于表示 USB 接口。接口中定义了一个方法 acceptUsb,用于让 USB 接口接受一个 USBPlug 插头。
package org.xiji.visitor3;
/**
* Usb接口 相当于元素接口
*/
public interface UsbPort {
/**
* 接受UsbPlug插头
*/
public void acceptUsb(USBPlug usbPlug);
}
3)电脑类
这段代码定义了一个 Computer 类,该类实现了 UsbPort 接口,并重写了 acceptUsb 方法。此外,还定义了一个 moveMouse 方法,用于模拟鼠标移动的操作
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)鼠标类
这段代码定义了一个 Mouse 类,该类实现了 USBPlug 接口,并重写了 acceptUsb 方法。Mouse 类用于模拟鼠标插入 USB 接口的行为,并调用 Computer 类中的 moveMouse 方法来模拟鼠标的移动。
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测试类
这段代码定义了一个 Visitor3Main 类,用于演示如何将鼠标插入电脑并通过 USB 接口进行交互。
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)23种设计模式讲解地址
23种设计模式讲解地址
专题地址:https://blog.csdn.net/2301_76862031/category_12779841.html
设计模式之访问者模式地址: https://blog.csdn.net/2301_76862031/article/details/141716629
设计模式之简单工厂模式地址: https://blog.csdn.net/2301_76862031/article/details/141641161
设计模式之策略模式工厂地址:https://blog.csdn.net/2301_76862031/article/details/141647304
设计模式之备忘录模式地址: https://blog.csdn.net/2301_76862031/article/details/141678153
设计模式之代理模式: https://blog.csdn.net/2301_76862031/article/details/141681834
设计模式之单例模式: https://blog.csdn.net/2301_76862031/article/details/141684340
设计模式之迭代器模式: https://blog.csdn.net/2301_76862031/article/details/141690379
设计模式之观察者模式:https://blog.csdn.net/2301_76862031/article/details/141723684
设计模式之命令模式: https://blog.csdn.net/2301_76862031/article/details/141728371
设计模式之模板方法模式: https://blog.csdn.net/2301_76862031/article/details/141729898
设计模式之桥接模式: https://blog.csdn.net/2301_76862031/article/details/141748997
设计模式之适配器模式: https://blog.csdn.net/2301_76862031/article/details/141752130
设计模式之外观模式: https://blog.csdn.net/2301_76862031/article/details/141753019
设计模式之享元模式: https://blog.csdn.net/2301_76862031/article/details/141755905
设计模式之原型模式: https://blog.csdn.net/2301_76862031/article/details/141759296
设计模式之责任链模式: https://blog.csdn.net/2301_76862031/article/details/141760704
设计模式之中介模式: https://blog.csdn.net/2301_76862031/article/details/141777728
设计模式之装饰者模式: https://blog.csdn.net/2301_76862031/article/details/141784167
设计模式之状态模式: https://blog.csdn.net/2301_76862031/article/details/141786766
设计模式之组合模式: https://blog.csdn.net/2301_76862031/article/details/141787708
设计模式之工厂方法模式: https://blog.csdn.net/2301_76862031/article/details/141826862
设计模式之解释器模式: https://blog.csdn.net/2301_76862031/article/details/141859953
2)23种设计模式源码下载地址: