目录
什么是访问者模式
Java 中的访问者模式(Visitor Pattern)是一种行为型设计模式,允许你在不修改已有类的结构的情况下,增加这些类的新功能。这是通过创建一个外部的访问者类来实现的,它可以处理不同类型的对象。
访问者模式的组成:
- 访问者接口(Visitor):定义了对每种元素类(Element)的访问操作。每个操作的名称和参数标识了被访问的元素类。
- 具体访问者(Concrete Visitor):实现访问者接口,定义了对每一个元素类的具体访问操作。
- 元素接口(Element):定义了一个接受访问者的方法(
accept(Visitor)
)。 - 具体元素(Concrete Element):实现元素接口,其
accept()
方法通常如下所示:visitor.visit(this);
。 - 对象结构(Object Structure):一个元素的集合,可以遍历这些元素,让访问者访问它们。
使用场景:
- 当一个对象结构包含很多类对象,且你想对这些对象执行一些依赖于其具体类的操作时。
- 需要对一个复杂的对象结构执行多种不同且不相关的操作,而且你想避免让这些操作"污染"这些对象的类时。
- 多个不同的外部类需要对某些类进行操作,但你不想修改类的情况下添加新操作。
示例代码:
这里,我们将创建一个表示计算机部件的类结构,并通过访问者来显示部件的信息和更新部件状态。
// 访问者接口
interface ComputerPartVisitor {
void visit(Computer computer);
void visit(Mouse mouse);
void visit(Keyboard keyboard);
void visit(Monitor monitor);
}
// 元素接口
interface ComputerPart {
void accept(ComputerPartVisitor computerPartVisitor);
}
// 具体元素类
class Keyboard implements ComputerPart {
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
class Monitor implements ComputerPart {
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
class Mouse implements ComputerPart {
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
class Computer implements ComputerPart {
ComputerPart[] parts;
public Computer(){
parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()};
}
public void accept(ComputerPartVisitor computerPartVisitor) {
for (int i = 0; i < parts.length; i++) {
parts[i].accept(computerPartVisitor);
}
computerPartVisitor.visit(this);
}
}
// 具体访问者
class ComputerPartDisplayVisitor implements ComputerPartVisitor {
public void visit(Computer computer) {
System.out.println("Displaying Computer.");
}
public void visit(Mouse mouse) {
System.out.println("Displaying Mouse.");
}
public void visit(Keyboard keyboard) {
System.out.println("Displaying Keyboard.");
}
public void visit(Monitor monitor) {
System.out.println("Displaying Monitor.");
}
}
// 示例
public class Main {
public static void main(String[] args) {
ComputerPart computer = new Computer();
computer.accept(new ComputerPartDisplayVisitor());
}
}
在这个例子中,ComputerPart
是元素接口,Computer
, Mouse
, Keyboard
, Monitor
是具体元素。ComputerPartVisitor
是访问者接口,ComputerPartDisplayVisitor
是具体访问者,定义了对每种类型的计算机部件的操作。
这样的设计使得新增其他操作(如维修、升级等)变得简单,只需添加新的访问者类而不用修改现有的元素类。
非常的实用,喜欢的小伙伴可以动动你们发财的小手,给博主一个小小的点赞或者关注,就是对博主最大的鼓励,爱你们哦~~