在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。
意图
主要将数据结构与数据操作分离。
实现
- 抽象访问者
//抽象访问者
public interface Vistor{
void visit(ElementA element);
void visit(ElementB element);
void visit(ElementC element);
void visit(ElementAll element);
}
- 实现访问者
//具体访问者
public class DisplayVisitor implements Vistor{
@Override
public void visit(ElementA element) {
System.out.println("visit ElementA");
}
@Override
public void visit(ElementB element) {
System.out.println("visit ElementB");
}
@Override
public void visit(ElementC element) {
System.out.println("visit ElementC");
}
@Override
public void visit(ElementAll element) {
System.out.println("visit Element Other");
}
}
- 抽象元素
//抽象元素
public interface Element{
void accept(Vistor vistor);
}
- 实现元素
//具体元素
public class ElementA implements Element{
@Override
public void accept(Vistor vistor) {
vistor.visit(this);
}
}
public class ElementB implements Element{
@Override
public void accept(Vistor vistor) {
vistor.visit(this);
}
}
public class ElementC implements Element{
@Override
public void accept(Vistor vistor) {
vistor.visit(this);
}
}
public class ElementAll implements Element{
private Element[] elements;
public ElementAll() {
this.elements = new Element[]{new ElementA(),new ElementB(),new ElementC()};
}
@Override
public void accept(Vistor vistor) {
for (Element element : elements) {
element.accept(vistor);
}
vistor.visit(this);
}
}
- 使用
public void main(String... args){
ElementAll elementAll = new ElementAll();
elementAll.accept(new DisplayVisitor());
}
- 结果
I/System.out: visit ElementA
I/System.out: visit ElementB
I/System.out: visit ElementC
I/System.out: visit Element Other