大话设计模式笔记 访客模式

访问者模式(Visitor),表示一个作用于某对象结构中的各元素的操作使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

 

 

 

 

把处理从数据结构分离出来。

有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的。

缺点:使得增加新的数据结构变得困难。

 

package visitor;

public abstract class Element {

    public abstract void accept(Visitor visitor);
    
}

 

package visitor;

public abstract class Visitor {

    public abstract void visitConcreteElementA(ConcreteElementA concreteElementA);
    
    public abstract void visitConcreteElementB(ConcreteElementB concreteElementB);
}

 

package visitor;

public class ConcreteElementA extends Element {

    @Override
    public void accept(Visitor visitor) {
        visitor.visitConcreteElementA(this);
    }

}

 

package visitor;

public class ConcreteElementB extends Element {

    @Override
    public void accept(Visitor visitor) {
        visitor.visitConcreteElementB(this);
    }

}

 

package visitor;

public class ConcreteVistor1 extends Visitor {

    @Override
    public void visitConcreteElementA(ConcreteElementA concreteElementA) {
        System.out.println("ConcreteVistor1 visitConcreteElementA");
    }

    @Override
    public void visitConcreteElementB(ConcreteElementB concreteElementB) {
        System.out.println("ConcreteVistor1 visitConcreteElementB");
    }

}

 

package visitor;

public class ConcreteVistor2 extends Visitor {

    @Override
    public void visitConcreteElementA(ConcreteElementA concreteElementA) {
        System.out.println("ConcreteVistor2 visitConcreteElementA");
    }

    @Override
    public void visitConcreteElementB(ConcreteElementB concreteElementB) {
        System.out.println("ConcreteVistor2 visitConcreteElementB");
    }

}

 

package visitor;

import java.util.ArrayList;

public class ObjectStructure {
    private ArrayList<Element> elements=new  ArrayList<Element>();
    
    public void add(Element element){
        elements.add(element);
    }
    
    public void remove(Element element){
        elements.remove(element);
    }
    
    public void accept(Visitor visitor) {
        for (Element element : elements) {
            element.accept(visitor);
        }
    }
    
    public static void main(String[] args) {
        ObjectStructure objectStructure=new ObjectStructure();
        objectStructure.add(new ConcreteElementA());
        objectStructure.add(new ConcreteElementB());
        
        ConcreteVistor1 concreteVistor1=new ConcreteVistor1();
        ConcreteVistor2 concreteVistor2=new ConcreteVistor2();
        
        objectStructure.accept(concreteVistor1);
        objectStructure.accept(concreteVistor2);
        
    }
}

 

posted @ 2015-10-15 14:10  郁闷紫番薯  阅读(415)  评论(0编辑  收藏  举报