设计模式之Visitor模式(笔记)
訪问者模式:表示一个作用于某个对象结构中的各元素操作。它使你能够不改变各元素的类的前提下定义作用于这些元素的新操作。
首先定义一个visitor抽象类,为每一个详细类声明一个visit操作
public abstract class Visitor {
public abstract void visitConcreteElementA(ConcreteElementA elementA);
public abstract void visitConcreteElementB(ConcreteElementB elementB);
}
接着定义继承visitor的详细类
public class ConcreteVisitor1 extends Visitor{
@Override
public void visitConcreteElementA(ConcreteElementA elementA) {
System.out.println(elementA.getClass().getName()+"訪问"+this.getClass().getName());
}
@Override
public void visitConcreteElementB(ConcreteElementB elementB) {
System.out.println(elementB.getClass().getName()+"訪问"+this.getClass().getName());
}
}
public class ConcreteVisitor2 extends Visitor{
@Override
public void visitConcreteElementA(ConcreteElementA elementA) {
System.out.println(elementA.getClass().getName()+"訪问"+this.getClass().getName());
}
@Override
public void visitConcreteElementB(ConcreteElementB elementB) {
System.out.println(elementB.getClass().getName()+"訪问"+this.getClass().getName());
}
}
然后定义一个Element抽象类,定义一个Accept方法
public abstract class Element {
public abstract void accept(Visitor visitor);
}
接着定义继承Element的详细类
public class ConcreteElementA extends Element{
@Override
public void accept(Visitor visitor) {
visitor.visitConcreteElementA(this);
}
public void operationA(){
}
}
public class ConcreteElementB extends Element{
@Override
public void accept(Visitor visitor) {
visitor.visitConcreteElementB(this);
}
public void operationB(){
}
}
然后定义一个ObjectStructure类,用来枚举它的元素
public class ObjectStructure {
private List<Element> elements=new ArrayList<Element>();
public void attach(Element element){
elements.add(element);
}
public void detach(Element element){
elements.remove(element);
}
public void accept(Visitor visitor){
Iterator<Element> iterator=elements.iterator();
while(iterator.hasNext()){
Element element=iterator.next();
element.accept(visitor);
}
}
}
client代码
public static void main(String[] args) {
//訪问者模式
ObjectStructure oStructure=new ObjectStructure();
oStructure.attach(new ConcreteElementA());
oStructure.attach(new ConcreteElementB());
ConcreteVisitor1 visitor1=new ConcreteVisitor1();
ConcreteVisitor2 visitor2=new ConcreteVisitor2();
oStructure.accept(visitor1);
oStructure.accept(visitor2);
}