设计模式之Visitor模式(笔记)

来源:互联网 发布:有趣的网站 知乎 网盘 编辑:程序博客网 时间:2024/06/03 21:03

访问者模式:表示一个作用于某个对象结构中的各元素操作。它使你可以不改变各元素的类的前提下定义作用于这些元素的新操作。
这里写图片描述

首先定义一个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);        }    }}

客户端代码

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);    }
0 0
原创粉丝点击