这种模式主要是为了实现下面一种功能:类的执行可以随着访问者改变而改变。简单实现:
元素类接口,也就是被访问者
interface Element {
void accept(Visitor visitor);
}
具体元素
public class ElementA implements Element{
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
public String actionA1() {
return "actionA1";
}
public String actionA2() {
return "actionA2";
}
}
public class ElementB implements Element{
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
public String actionB1() {
return "actionB1";
}
public String actionB2() {
return "actionB2";
}
}
访问者接口
interface Visitor {
void visit(ElementA e);
void visit(ElementB e);
}
具体访问者
public class Visitor1 implements Visitor {
@Override
public void visit(ElementA e) {
System.out.println(e.actionA1());
}
@Override
public void visit(ElementB e) {
System.out.println(e.actionB1());
}
}
public class Visitor2 implements Visitor {
@Override
public void visit(ElementA e) {
System.out.println(e.actionA2());
}
@Override
public void visit(ElementB e) {
System.out.println(e.actionB2());
}
}
结构类,类似于管理者
public class Structure {
private ArrayList<Element> elementList = new ArrayList<>();
public void action(Visitor visitor) {
for (Element e : elementList) {
e.accept(visitor);
}
}
public void add(Element e) {
elementList.add(e);
}
}
测试类·
public static void main(String[] args) {
Structure structure = new Structure();
structure.add(new ElementA());
structure.add(new ElementB());
Visitor1 visitor1 = new Visitor1();
structure.action(visitor1);
Visitor2 visitor2 = new Visitor2();
structure.action(visitor2);
}
网友评论