visitor设计模式
对外部提供访问ADT的方式,灵活扩展ADT的方法
类结构
- 一个抽象接口
- 多个具体实现类
- 一个抽象访问者
- 多个具体访问者
目标:给具体实现类灵活扩展方法
抽象接口
// Element.java
// 面向接口编程
public interface Element {
// some methods
//...
// 提供accept接口
void accept(Visitor visitor);
}
具体实现类A
// ConcreteElementA.java
public class ConcreteElementA implements Element {
// override some methods
// ...
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
具体实现类B
// ConcreteElementB.java
public class ConcreteElementB implements Element {
// override some methods
// ...
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
抽象访问者
// Visitor.java
public interface Visitor {
void visit(ConcreteElementA element);
void visit(ConcreteElementB element);
}
具体访问者1
// ConcreteVisitor1.java
public class ConcreteVisitor1 implements Visitor {
@Override
public void visit(ConcreteElementA a) {
System.out.println("a1");
}
@Override
public void visit(ConcreteElementB b) {
System.out.println("b1");
}
}
具体访问者2
// ConcreteVisitor2.java
public class ConcreteVisitor2 implements Visitor {
@Override
public void visit(ConcreteElementA a) {
System.out.println("a2");
}
@Override
public void visit(ConcreteElementB b) {
System.out.println("b2");
}
}
客户端
// Client.java
public static void main(String[] args) {
Visitor visitor1 = new ConcreteVisitor1();
Visitor visitor2 = new ConcreteVisitor2();
Element a = new ConcreteElementA();
Element b = new ConcreteElementB();
a.accept(visitor1);
a.accept(visitor2);
b.accept(visitor1);
b.accept(visitor2);
}
// in terminal
// a1
// a2
// b1
// b2
通过传入不同的ConcreteVisitor,可为a, b扩展不同的方法