对异构容器的各个元素进行有区别的访问(操作)。
把数据(异构容器的元素)和操作(访问器)分离出来,使之各自独立演化。
方便新增操作,不方便新增数据。
每个元素可以接受不同访问者的访问,每个访问者可以访问容器内的所有元素(抽象访问者规定了所有可访问的元素)。
public class Test4 {
/**
* @param args
*/
public static void main(String[] args) {
ConcreteElementA a = new ConcreteElementA();
a.setName("jack");
ConcreteElementB b = new ConcreteElementB();
b.setAge(100);
Container c = new Container();
c.addElement(a);
c.addElement(b);
Visitor v1 = new ConcreteVisitor1();
c.acceptVisit(v1);
Visitor v2 = new ConcreteVisitor2();
c.acceptVisit(v2);
}
}
//异构容器
//容器内的数据类型要尽量少且比较稳定(不会增加新的类型)
class Container {
private List<Element> list = new ArrayList<Element>();
public void addElement(Element e) {
list.add(e);
}
public void removeElement(Element e) {
list.remove(e);
}
// 对容器进行访问
public void acceptVisit(Visitor v) {
for(Element e : list) {
e.accept(v);
}
}
}
// 异构容器里面的元素要实现的接口,定义这个接口的目的就是为了方便Visitor的介入
interface Element {
void accept(Visitor v);
}
class ConcreteElementA implements Element {
private String name;
public void accept(Visitor v) {
v.visit(this);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class ConcreteElementB implements Element {
private int age;
public void accept(Visitor v) {
v.visit(this);
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
interface Visitor {
void visit(ConcreteElementA a);
void visit(ConcreteElementB b);
}
class ConcreteVisitor1 implements Visitor {
public void visit(ConcreteElementA a) {
System.out.println("============" + " Visitor1访问ElementA: " + a.getName() + " =============");
}
public void visit(ConcreteElementB b) {
System.out.println("============" + " Visitor1访问ElementB: " + b.getAge() + " =============");
}
}
class ConcreteVisitor2 implements Visitor {
public void visit(ConcreteElementA a) {
System.out.println("************" + " Visitor2访问ElementA: " + a.getName() + " *************");
}
public void visit(ConcreteElementB b) {
System.out.println("************" + " Visitor2访问ElementB: " + b.getAge() + " *************");
}
}
运行结果:
============ Visitor1访问ElementA: jack =============
============ Visitor1访问ElementB: 100 =============
************ Visitor2访问ElementA: jack *************
************ Visitor2访问ElementB: 100 *************