访问者模式
访问者模式(Visitor Pattern)是一种行为型设计模式,它在不改变已有类的情况下,定义了一组新的操作方法,以应对已有类中的各种元素。访问者模式将算法与对象结构分离开来,使得算法可以独立于对象结构而变化。
在访问者模式中,有两类对象:访问者和被访问者。被访问者是指具体的对象,它们可能是复杂的对象结构,如树形结构或图形结构等。访问者是指一组新的操作方法,它们将应用于被访问者中的各个元素。访问者的方法需要访问被访问者中的各个元素,从而完成特定的操作。
在访问者模式中,访问者通过调用被访问者中的 accept() 方法来访问被访问者中的元素,从而完成操作。被访问者中的 accept() 方法接受一个访问者作为参数,并将自己作为参数传递给访问者的操作方法。访问者中的操作方法可以根据不同的被访问者类型,执行不同的操作。
以下是使用访问者模式的一个简单示例代码:
// 访问者接口
interface Visitor {
void visit(ConcreteElementA element);
void visit(ConcreteElementB element);
}
// 具体访问者A
class ConcreteVisitorA implements Visitor {
@Override
public void visit(ConcreteElementA element) {
System.out.println("ConcreteVisitorA visit ConcreteElementA");
}
@Override
public void visit(ConcreteElementB element) {
System.out.println("ConcreteVisitorA visit ConcreteElementB");
}
}
// 具体访问者B
class ConcreteVisitorB implements Visitor {
@Override
public void visit(ConcreteElementA element) {
System.out.println("ConcreteVisitorB visit ConcreteElementA");
}
@Override
public void visit(ConcreteElementB element) {
System.out.println("ConcreteVisitorB visit ConcreteElementB");
}
}
// 抽象被访问者
interface Element {
void accept(Visitor visitor);
}
// 具体被访问者A
class ConcreteElementA implements Element {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
// 具体被访问者B
class ConcreteElementB implements Element {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
// 对象结构
class ObjectStructure {
private List<Element> elements = new ArrayList<>();
public void add(Element element) {
elements.add(element);
}
public void remove(Element element) {
elements.remove(element);
}
public void accept(Visitor visitor) {
for (Element element : elements) {
element.accept(visitor);
}
}
}
// 测试类
public class Main {
public static void main(String[] args) {
ObjectStructure objectStructure = new ObjectStructure();
objectStructure.add(new ConcreteElementA());
objectStructure.add(new ConcreteElementB());
Visitor visitorA = new ConcreteVisitorA();
Visitor visitorB = new ConcreteVisitorB();
objectStructure.accept(visitorA);
objectStructure.accept(visitorB);
}
}
在上面的代码中,访问者接口定义了 visit() 方法,该方法分别接受不同类型的被访问者作为参数。具体访问者A和具体访问者B分别实现了 Visitor 接口的方法,分别针对不同的被访问者类型,执行不同的操作。
抽象被访问者接口定义了 accept() 方法,该方法接受一个访问者作为参数。具体被访问者A和具体被访问者B分别实现了 accept() 方法,将自己作为参数传递给访问者的操作方法。
对象结构类中包含了被访问者的集合,它实现了 accept() 方法,遍历集合中的每个被访问者,调用它们的 accept() 方法,将访问者作为参数传递给被访问者。