设计模式之访问者模式

xiaoxiao2021-02-27  324

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

角色:

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

转载请注明原文地址: https://www.6miu.com/read-5649.html

最新回复(0)