时间:2025-03-21 23:15
人气:
作者:admin
访问者(Visitor)模式属于行为型模式的一种。
访问者模式主要用于分离算法和对象结构,从而在不修改原有对象的情况下扩展新的操作。它适用于数据结构相对稳定,而操作(行为)容易变化的场景。
访问者模式允许在不修改现有类的情况下,为类层次结构中的对象定义新的操作。
访问者模式通过将操作封装到一个独立的类(即访问者)中,使得对象结构与操作解耦。
访问者模式使用了一种名为双分派(在运行时根据两个对象的类型动态选择方法)的技巧。
Java标准库中的 FileVisitor,就是使用的访问者模式。访问者模式的设计比较复杂。
访问者模式适用于以下场景:
访问者模式通常有以下组成部分:
我们模拟一下访问者模式的实现。
1、定义访问者接口
// 访问者接口
interface Visitor {
void visit(ConcreteElementA elementA);
void visit(ConcreteElementB elementB);
}
2、定义具体访问者
// 具体访问者1
class ConcreteVisitor1 implements Visitor {
@Override
public void visit(ConcreteElementA elementA) {
System.out.println("Visitor1 访问 " + elementA.getName());
}
@Override
public void visit(ConcreteElementB elementB) {
System.out.println("Visitor1 访问 " + elementB.getName());
}
}
// 具体访问者2
class ConcreteVisitor2 implements Visitor {
@Override
public void visit(ConcreteElementA elementA) {
System.out.println("Visitor2 访问 " + elementA.getName());
}
@Override
public void visit(ConcreteElementB elementB) {
System.out.println("Visitor2 访问 " + elementB.getName());
}
}
3、定义元素接口
// 元素接口
interface Element {
void accept(Visitor visitor);
}
4、定义具体元素
// 具体元素 A
class ConcreteElementA implements Element {
private String name = "ElementA";
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
public String getName() {
return name;
}
}
// 具体元素 B
class ConcreteElementB implements Element {
private String name = "ElementB";
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
public String getName() {
return name;
}
}
5、定义对象结构
// 对象结构,包含多个元素
class ObjectStructure {
private List<Element> elements = new ArrayList<>();
public void addElement(Element element) {
elements.add(element);
}
public void accept(Visitor visitor) {
for (Element element : elements) {
element.accept(visitor);
}
}
}
6、测试访问者模式
public class VisitorPatternDemo {
public static void main(String[] args) {
ObjectStructure structure = new ObjectStructure();
// 添加元素
structure.addElement(new ConcreteElementA());
structure.addElement(new ConcreteElementB());
// 使用不同的访问者访问元素
Visitor visitor1 = new ConcreteVisitor1();
Visitor visitor2 = new ConcreteVisitor2();
System.out.println("使用 Visitor1 访问:");
structure.accept(visitor1);
System.out.println("\n使用 Visitor2 访问:");
structure.accept(visitor2);
}
}
访问者模式的优缺点。
优点:
缺点:
我们可以将访问者模式视为命令模式的加强版本,其对象可对不同类的多种对象执行操作。
至此23种设计模式暂告一个段落了。我们将开启下个篇章。
只有读不完的书,哪有不会走的人。-- 烟沙九洲
上一篇:[设计模式]行为型-责任链模式
下一篇:掌握设计模式--访问者模式