一、概念
访问者模式(Visitor),封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
访问者模式包含以下主要角色。
A、抽象访问者(Visitor)角色:定义一个访问具体元素的接口,为每个具体元素类对应一个访问操作 visit() ,该操作中的参数类型标识了被访问的具体元素。
B、具体访问者(ConcreteVisitor)角色:实现抽象访问者角色中声明的各个访问操作,确定访问者访问一个元素时该做什么。
C、抽象元素(Element)角色:声明一个包含接受操作 accept() 的接口,被接受的访问者对象作为 accept() 方法的参数。
D、具体元素(ConcreteElement)角色:实现抽象元素角色提供的 accept() 操作。
E、对象结构(Object Structure)角色:是一个包含元素角色的容器,提供让访问者对象遍历容器中的所有元素的方法。
二、例子
A、抽象访问者(Visitor)角色:
1 package comm.pattern.action.visitor; 2 3 /** 4 * 5 * @Title: IVisitor.java 6 * @Package: comm.pattern.action.visitor 7 * @Description: 描述该文件做什么 8 * @author yangzhancheng 9 * @2020年3月14日:下午1:01:14 10 * 11 */ 12 public interface IVisitor { 13 14 void visit(ConcreteElementA element); 15 void visit(ConcreteElementB element); 16 17 }
B、具体访问者(ConcreteVisitor)角色:
B-1:
1 package comm.pattern.action.visitor; 2 3 /** 4 * 5 * @Title: ConcreteVisitorA.java 6 * @Package: comm.pattern.action.visitor 7 * @Description: 描述该文件做什么 8 * @author yangzhancheng 9 * @2020年3月14日:下午1:01:45 10 * 11 */ 12 public class ConcreteVisitorA implements IVisitor{ 13 14 public void visit(ConcreteElementA element) { 15 System.out.println("访问者A访问-->" + element.operationA()); 16 } 17 18 public void visit(ConcreteElementB element) { 19 System.out.println("访问者A访问-->" + element.operationB()); 20 } 21 22 }
B-2:
1 package comm.pattern.action.visitor; 2 3 /** 4 * 5 * @Title: ConcreteVisitorB.java 6 * @Package: comm.pattern.action.visitor 7 * @Description: 描述该文件做什么 8 * @author yangzhancheng 9 * @2020年3月14日:下午1:02:36 10 * 11 */ 12 public class ConcreteVisitorB implements IVisitor{ 13 14 public void visit(ConcreteElementA element) { 15 System.out.println("访问者B访问-->" + element.operationA()); 16 } 17 18 public void visit(ConcreteElementB element) { 19 System.out.println("访问者B访问-->" + element.operationB()); 20 } 21 22 }
C、抽象元素(Element)角色:声明一个包含接受操作 accept() 的接口,被接受的访问者对象作为 accept() 方法的参数。
1 package comm.pattern.action.visitor; 2 3 /** 4 * 5 * @Title: Element.java 6 * @Package: comm.pattern.action.visitor 7 * @Description: 描述该文件做什么 8 * @author yangzhancheng 9 * @2020年3月14日:下午1:03:02 10 * 11 */ 12 public interface Element { 13 14 void accept(IVisitor visitor); 15 16 }
D、具体元素(ConcreteElement)角色:实现抽象元素角色提供的 accept() 操作。
D-1:
1 package comm.pattern.action.visitor; 2 3 /** 4 * 5 * @Title: ConcreteElementA.java 6 * @Package: comm.pattern.action.visitor 7 * @Description: 描述该文件做什么 8 * @author yangzhancheng 9 * @2020年3月14日:下午1:03:20 10 * 11 */ 12 public class ConcreteElementA implements Element{ 13 14 public void accept(IVisitor visitor) { 15 visitor.visit(this); 16 } 17 18 public String operationA() { 19 return "元素A的操作。"; 20 } 21 }
D-2
1 package comm.pattern.action.visitor; 2 3 /** 4 * 5 * @Title: ConcreteElementB.java 6 * @Package: comm.pattern.action.visitor 7 * @Description: 描述该文件做什么 8 * @author yangzhancheng 9 * @2020年3月14日:下午1:03:53 10 * 11 */ 12 public class ConcreteElementB implements Element{ 13 14 public void accept(IVisitor visitor) { 15 visitor.visit(this); 16 } 17 18 public String operationB() { 19 return "元素B的操作。"; 20 } 21 }
E、对象结构(Object Structure)角色:是一个包含元素角色的容器,提供让访问者对象遍历容器中的所有元素的方法。
1 package comm.pattern.action.visitor; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 import java.util.List; 6 7 /** 8 * 9 * @Title: ObjectStructure.java 10 * @Package: comm.pattern.action.visitor 11 * @Description: 描述该文件做什么 12 * @author yangzhancheng 13 * @2020年3月14日:下午1:04:25 14 * 15 */ 16 public class ObjectStructure { 17 private List<Element> list = new ArrayList<Element>(); 18 19 public void accept(IVisitor visitor) { 20 Iterator<Element> i = list.iterator(); 21 while (i.hasNext()) { 22 ((Element) i.next()).accept(visitor); 23 } 24 } 25 26 public void add(Element element) { 27 list.add(element); 28 } 29 30 public void remove(Element element) { 31 list.remove(element); 32 } 33 }
允许结果
具体访问者A访问-->具体元素A的操作。 具体访问者A访问-->具体元素B的操作。 ------------------------ 具体访问者B访问-->具体元素A的操作。 具体访问者B访问-->具体元素B的操作。
三、总结
Java8 新特性之集合: forEach(Consumer<? super T> action) 后续分析
原文:https://www.cnblogs.com/fating/p/12495404.html