文章摘要: 访问者模式使用总结。
简介
简要说明
- 访问者模式(Visitor Pattern)是一种行为型设计模式。
- 定义了一个操作对象结构的接口,让访问者能够对对象结构中的元素进行操作,而不改变这些元素所属的类。
主要功能
- 表示一个作用于某对象结构中的各元素的操作,它可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
- 将操作与对象结构分离,使得操作可以独立变化。
- 可以在不修改现有类层次结构的情况下,增加新的操作。
注意事项
- 访问者模式会增加系统复杂度,因为它要求元素类能够接受访问者对象,这就要求元素类必须有一个接收访问者的接口。
- 访问者模式要求对象结构中的元素类是稳定的,如果元素类经常变化,那么引入访问者模式可能不合适。
- 访问者对象访问元素类的具体实现时,可能需要了解元素类的内部细节,这可能会破坏封装性。
适用场景
- 对象结构相对稳定,但经常需要在此对象结构上定义新的操作。
- 需要对对象结构中的对象进行很多不同的并且不相关的操作,而需要避免这些操作污染这些对象的类,也不希望在类中添加新的特性。
Java 8
案例
// 定义一个表示元素的接口
interface Element {
void accept(Visitor visitor);
}
// 具体的元素类A
class ConcreteElementA implements Element {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
public String operationA() {
return "ConcreteElementA";
}
}
// 具体的元素类B
class ConcreteElementB implements Element {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
public String operationB() {
return "ConcreteElementB";
}
}
// 访问者接口
interface Visitor {
void visit(ConcreteElementA elementA);
void visit(ConcreteElementB elementB);
}
// 具体的访问者类
class ConcreteVisitor implements Visitor {
@Override
public void visit(ConcreteElementA elementA) {
System.out.println("Visited " + elementA.operationA());
}
@Override
public void visit(ConcreteElementB elementB) {
System.out.println("Visited " + elementB.operationB());
}
}
// 对象结构类,通常包含一个元素集合
class ObjectStructure {
private List<Element> elements = new ArrayList<>();
public void attach(Element element) {
elements.add(element);
}
public void detach(Element element) {
elements.remove(element);
}
public void accept(Visitor visitor) {
for (Element element : elements) {
element.accept(visitor);
}
}
}
// 客户端代码
public class VisitorPatternDemo {
public static void main(String[] args) {
// 创建对象结构
ObjectStructure structure = new ObjectStructure();
// 添加元素到对象结构
structure.attach(new ConcreteElementA());
structure.attach(new ConcreteElementB());
// 创建访问者
Visitor visitor = new ConcreteVisitor();
// 对象结构接受访问者
structure.accept(visitor);
}
}
注释
- 在这个例子中,
Element接口定义了一个accept方法,该方法接受一个Visitor对象作为参数。 ConcreteElementA和ConcreteElementB是具体的元素类,它们实现了Element接口,并在accept方法中调用访问者的visit方法。Visitor接口定义了访问者可以执行的操作,这里有两个visit方法,分别对应不同的元素类。ConcreteVisitor是具体的访问者类,它实现了Visitor接口,并在visit方法中定义了访问元素时执行的操作。ObjectStructure类表示对象结构,它包含一个元素集合,并提供方法来添加、移除元素以及接受访问者。- 在客户端代码
VisitorPatternDemo中,我们创建了一个对象结构,添加了两个元素,并创建了一个访问者。然后,我们调用对象结构的accept方法,这会遍历所有元素并调用它们的accept方法,从而触发访问者的visit方法。这样,访问者就可以对每个元素执行特定的操作,而无需修改元素类本身。