访问者模式:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作
UML:
JAVA:
import java.util.LinkedList;
import java.util.List;
public class VisitorTest {
public static void main(String[] args) {
ObjectStructure o = new ObjectStructure();
o.attach(new ConcreteElementA());
o.attach(new ConcreteElementB());
ConcreteVisitor1 v1 = new ConcreteVisitor1();
o.accept(v1);
}
}
class ObjectStructure{
private List<Element> elements = new LinkedList<>();
public void attach(Element element){
elements.add(element);
}
public void detach(Element element){
elements.remove(element);
}
public void accept(Visitor visitor){
for (Element e:elements ) {
e.accept(visitor);
}
}
}
abstract class Visitor{
public abstract void visitConcreteElementA(ConcreteElementA elementA);
public abstract void visitConcreteElementB(ConcreteElementB elementB);
}
class ConcreteVisitor1 extends Visitor{
@Override
public void visitConcreteElementA(ConcreteElementA elementA) {
System.out.println(elementA.getClass().getTypeName()+"被"+this.getClass().getTypeName()+"访问");
}
@Override
public void visitConcreteElementB(ConcreteElementB elementB) {
System.out.println(elementB.getClass().getTypeName()+"被"+this.getClass().getTypeName()+"访问");
}
}
abstract class Element{
public abstract void accept(Visitor visitor);
}
class ConcreteElementA extends Element{
@Override
public void accept(Visitor visitor) {
visitor.visitConcreteElementA(this);
}
}
class ConcreteElementB extends Element{
@Override
public void accept(Visitor visitor) {
visitor.visitConcreteElementB(this);
}
}