访问者模式是一种将数据结构和和数据操作分离的设计模式。当系统中存在类型数目稳定(固定)的一类数据时,可以通过访问者模式方便的实现该类型所有数据结构的不同操作,而又不会对数据产生任何副作用(脏数据) 试用场景: 1,数据结构稳定,作用于数据结构的操作经常变化的场景。 2,需要数据结构和数据操作分离的场景。 3,需要对不同数据类型(元素)操作,而不使用分支判断具体类型的场景。 直接上通用代码:
// 抽象访问者
public interface IVisitor {
void visit(ConcreteElementA element);
void visit(ConcreteElementB element);
}
// 具体访问者A
public class ConcreteVisitorA implements IVisitor {
public void visit(ConcreteElementA element) {
String result = element.operationA();
System.out.println("result from " + element.getClass().getSimpleName() + ": " + result);
}
public void visit(ConcreteElementB element) {
int result = element.operationB();
System.out.println("result from " + element.getClass().getSimpleName() + ": " + result);
}
}
// 具体访问者B
public class ConcreteVisitorB implements IVisitor {
public void visit(ConcreteElementA element) {
String result = element.operationA();
System.out.println("result from " + element.getClass().getSimpleName() + ": " + result);
}
public void visit(ConcreteElementB element) {
int result = element.operationB();
System.out.println("result from " + element.getClass().getSimpleName() + ": " + result);
}
}
// 抽象元素
public interface IElement {
void accept(IVisitor visitor);
}
// 具体元素A
public class ConcreteElementA implements IElement {
public void accept(IVisitor visitor) {
visitor.visit(this);
}
public String operationA() {
return this.getClass().getSimpleName();
}
}
// 具体元素B
public class ConcreteElementB implements IElement {
public void accept(IVisitor visitor) {
visitor.visit(this);
}
public int operationB() {
return new Random().nextInt(100);
}
}
// 结构对象
public class ObjectStructure {
private List<IElement> list = new ArrayList<IElement>();
{
this.list.add(new ConcreteElementA());
this.list.add(new ConcreteElementB());
}
public void accept(IVisitor visitor) {
for (IElement element : this.list) {
element.accept(visitor);
}
}
}
public class Test {
public static void main(String[] args) {
ObjectStructure collection = new ObjectStructure();
System.out.println("ConcreteVisitorA handle elements:");
IVisitor visitorA = new ConcreteVisitorA();
collection.accept(visitorA);
System.out.println("------------------------------------");
System.out.println("ConcreteVisitorB handle elements:");
IVisitor visitorB = new ConcreteVisitorB();
collection.accept(visitorB);
}
}
##############控制台输出#############
ConcreteVisitorA handle elements:
result from ConcreteElementA: ConcreteElementA
result from ConcreteElementB: 79
------------------------------------
ConcreteVisitorB handle elements:
result from ConcreteElementA: ConcreteElementA
result from ConcreteElementB: 37
上类图:
