设计模式之访问者模式

来源:互联网 发布:查询淘宝购物记录 编辑:程序博客网 时间:2024/06/16 00:42

概述:对于某个对象或者一组对象,不同的访问者,产生的结果不同,执行操作也不同

角色:

  • Visitor 为该对象结构中ConcreteElement的每一个类声明一个Visit操作。
    该操作的名字和特征标识了发送Visit请求给该访问者的那个类。 这使得访问者可以确定正被访问元素的具体的类。
    这样访问者就可以通过该元素的特定接口直接访问它
  • ConcreteVisitor 实现每个由Visitor声明的操作。 每个操作实现本算法的一部分,而该算法片断乃是对应于结构中对象的类。
    ConcreteVisitor为该算法提供了上下文并存储它的局部状态。 这一状态常常在遍历该结构的过程中累积结果
  • Element 定义一个Accept操作,它以一个访问者为参数
  • ConcreteElement 实现Accept操作,该操作以一个访问者为参数
  • ObjectStructure 能枚举它的元素。 可以提供一个高层的接口以允许该访问者访问它的元素。可以是一个复合或是一个集合,如一个列表或一个无序集合

类图:
这里写图片描述

实现:
访问者接口:

public interface Visitor {    public void visit(ElementA elementA);    public void visit(ElementB elementB);}

访问者实现:

public class VisitorA implements Visitor {    public void visit(ElementA elementA) {        System.out.println("VisitorA");        elementA.method2();    }    public void visit(ElementB elementB) {        System.out.println("VisitorA");        elementB.method2();    }}
public class VisitorB implements Visitor {    public void visit(ElementA elementA) {        System.out.println("VisitorB");        elementA.method2();    }    public void visit(ElementB elementB) {        System.out.println("VisitorB");        elementB.method2();    }}

被访问者接口:

interface Element {    public void method1(Visitor visitor);    public void method2();}

被访问者实现:

public class ElementA implements Element {    public void method1(Visitor visitor) {        visitor.visit(this);    }    public void method2() {        System.out.println("ElementA visited");    }}
public class ElementB implements Element {    public void method1(Visitor visitor) {        visitor.visit(this);    }    public void method2() {        System.out.println("ElementB visited");    }}

操作:

public class Context {    List<Element> elementList = new ArrayList<Element>();    public void add(Element element) {        elementList.add(element);    }    public void visit(Visitor visitor) {        for(Element element : elementList){            element.method1(visitor);        }    }}

测试:

public class testVisotor {    private static Context ctx = new Context();    public static void main(String[] args) {        ctx.add(new ElementA());        ctx.add(new ElementB());        ctx.add(new ElementA());        ctx.add(new ElementB());        ctx.visit(new VisitorA());        ctx.visit(new VisitorB());    }}

打印:
VisitorA
ElementA visited
VisitorA
ElementB visited
VisitorA
ElementA visited
VisitorA
ElementB visited
VisitorB
ElementA visited
VisitorB
ElementB visited
VisitorB
ElementA visited
VisitorB
ElementB visited

0 0
原创粉丝点击