首页 > 其他 > 详细

设计模式--访问者模式

时间:2020-03-15 09:30:01      阅读:68      评论:0      收藏:0      [点我收藏+]

一、概念

 访问者模式(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 }
View Code

   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 }
View Code

 

   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 }
View Code

 

   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 }
View Code

 

   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 }
View Code

   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 }
View Code

 

   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 }
View Code

 

允许结果

具体访问者A访问-->具体元素A的操作。
具体访问者A访问-->具体元素B的操作。
------------------------
具体访问者B访问-->具体元素A的操作。
具体访问者B访问-->具体元素B的操作。

 

三、总结

Java8 新特性之集合: forEach(Consumer<? super T> action) 后续分析

设计模式--访问者模式

原文:https://www.cnblogs.com/fating/p/12495404.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!