Visitor定义:作用于某个对象群中各个对象的操作。它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作。

在Java中,Visitor模式实际上是分离了collection结构中的元素和对这些元素进行操作的行为。

为何使用Visitor模式

Java的Collection(包括Vector和Hashtable)是我们最经常使用的技术,可是Collection好象是个黑色大染缸,本来有各种鲜明类型特征的对象一旦放入后,再取出时,这些类型就消失了。那么我们势必要用If来判断,如:

Iterator iterator = collection.iterator()

while (iterator.hasNext()) {

Object o = iterator.next();

if (o instanceof Collection)

messyPrintCollection((Collection)o);

else if (o instanceof String)

System.out.println("'"+o.toString()+"'");

else if (o instanceof Float)

System.out.println(o.toString()+"f");

else

System.out.println(o.toString());

}

在上例中,我们使用了 instanceof来判断 o的类型。

很显然,这样做的缺点代码If else if 很繁琐,我们就可以使用Visitor模式解决它。

如何使用Visitor模式

针对上例,我们设计一个接口visitor访问者:

public interface Visitor

{

public void visitCollection(Collection collection);

public void visitString(String string);

public void visitFloat(Float float);

}

在这个接口中,将我们认为Collection有可能的类的类型放入其中。

有了访问者,我们需要被访问者,被访问者就是我们Collection的每个元素Element,我们要为这些Element定义一个可以接受访问的接口(访问和被访问是互动的,只有访问者,被访问者如果表示不欢迎,访问者就不能访问)。

我们定义这个接口叫Visitable,用来定义一个Accept操作,也就是说让Collection每个元素具备可访问性。

public interface Visitable{

public void accept(Visitor visitor);

}

好了,有了两个接口,我们就要定义他们的具体实现(Concrete class):

public class ConcreteElement implements Visitable

{

private String value;

public ConcreteElement(String string) {

value = string;

}

//定义accept的具体内容 这里是很简单的一句调用

public void accept(Visitor visitor) {

visitor.visitString(this);

}

}

再看看访问者的Concrete实现:

public class ConcreteVisitor implements Visitor

{

//在本方法中,我们实现了对Collection的元素的成功访问

public void visitCollection(Collection collection) {

Iterator iterator = collection.iterator()

while (iterator.hasNext()) {

Object o = iterator.next();

if (o instanceof Visitable)

((Visitable)o).accept(this);

}

public void visitString(String string) {

System.out.println("'"+string+"'");

}

public void visitFloat(Float float) {

System.out.println(float.toString()+"f");

}

}

在上面的visitCollection我们实现了对Collection每个元素访问,只使用了一个判断语句,只要判断其是否可以访问。

至此,我们完成了Visitor模式基本架构。

使用Visitor模式的前提

对象群结构中(Collection) 中的对象类型很少改变,也就是说访问者的身份类型很少改变,如上面中Visitor中的类型很少改变,如果需要增加新的操作,比如上例中我们在ConcreteElement具体实现外,还需要新的ConcreteElement2 ConcreteElement3。

可见使用Visitor模式是有前提的,在两个接口Visitor和Visitable中,确保Visitor很少变化,变化的是Visitable,这样使用Visitor最方便。

如果Visitor也经常变化,也就是说,对象群中的对象类型经常改变,一般建议是,不如在这些对象类中逐个定义操作,但是Java的Reflect技术解决了这个问题。

java visitor_Java访问模式(Visitor者模式)相关推荐

  1. java visitor_Java设计模式(三) Visitor(访问者)模式及多分派场景应用

    基本概念 Visitor 封装一些作用于数据结构中的各元素的操作,不同的操作可以借助新的visitor实现,降低了操作间的耦合性 访问者可以将数据结构和对数据的操作解耦,使得增加对数据结构的操作不需要 ...

  2. [导入]C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式.zip(10.41 MB)...

    讲座内容: 本培训课程探讨GoF23之 Visitor 访问者模式的意图.动因.原理.应用场景与C#语言实现,以及该模式在.NET框架程序设计中的具体应用. 课程讲师: 李建忠 上海祝成信息科技有限公 ...

  3. (24):(行为型模式) Visitor 访问者模式

    [所有分类] 转载于:https://www.cnblogs.com/hyp5490-/p/3891411.html

  4. 设计模式 创建模式 结构模式和行为模式

    创建型模式关注对象的创建 结构型模式关注类或对象之间的组织关系 行为型模式关注类或对象间的交互和职责分配(就是用来干什么) 模式从本质上都是简化和分解类或对象,使易于扩展或封装性更好:一些相似的模式的 ...

  5. 反模式? 只有模式不彻底吧

    我认为,没有反模式,只有模式不彻底. " 某人说:"软件都不是一个人能写出来的,我们需要去整体控制." 他快要走了,那个影响我太多的人. " 1. Cremat ...

  6. java visitor_Java 的双重分发与 Visitor 模式

    双重分发(Double Dispatch) 什么是双重分发? 谈起面向对象的程序设计时,常说起的面向对象的「多态」,其中关于多态,经常有一个说法是「父类引用指向子类对象」. 这种父类的引用指向子类对象 ...

  7. java visitor_Java Visitor Pattern(访问者模式)

    在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法.通过这种方式,元素的执行算法可以随着访问者改变而改变.这种类型的设计模式属于行为型模式.根据模式,元 ...

  8. 设计模式的理解: 访问器模式 Visitor

    在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法.通过这种方式,元素的执行算法可以随着访问者改变而改变.这种类型的设计模式属于行为型模式.根据模式,元 ...

  9. Java 设计模式之 Visitor 访问者模式

    Visitor 访问者模式适用的场景是,存在某个容器,里面的组成部分不会发生变化,对这些组成部分的访问,不是由这个容器决定,而是交给访问者决定. 举个生活中的例子,比如稻草人,卖包,卖鞋子这些固定的消 ...

最新文章

  1. android捕获方法,android捕获Home键的方法
  2. 开发日记-20190506 关键词 汇编语言(五)Hello World!
  3. 《基于张量网络的机器学习入门》学习笔记6
  4. 微信小程序之授权登录--项目需要
  5. 利用微软类库 Visual Studio International Pack 汉字转拼音
  6. Moodle: Remove customise this page button from profile?
  7. 如何基于Docker快速搭建Elasticsearch集群?
  8. 12505 java_Java jdbc Oracle error: ORA 12505
  9. php 字符ascii转中文,PHP ASCII码与字符串相互转换的方法
  10. 华为harmonyOS开发者日,华为首届HarmonyOS开发者创新大赛收官
  11. 用C#,SQL Server编写的音乐播放软件
  12. 基于PLECS的Boost变换器仿真与分析
  13. ubuntu安装nvidia显卡驱动
  14. git index.lock
  15. 2010年上半年5月份系统分析师上午试题答案(分析与解答)之十
  16. 狄利克雷卷积_狄利克雷卷积学习笔记
  17. Sign签名生成与校验
  18. element-ui 上传图片,图片404
  19. yolov5 nms 源码理解
  20. MPLS LDP基础

热门文章

  1. 牛客 - 牛牛的树行棋
  2. 游戏开发物理引擎PhysX研究系列:PhysX.Net框架使用
  3. ChatGPT背后有哪些关键技术?CSIG企业行带你一探究竟
  4. MS1826 HDMI 四进四出多功能视频处理器
  5. 2023热销护眼灯品牌:大国品牌,爱德华医生护眼灯52年匠心之路
  6. 计算机学院五名学生开发手语app,参考答案2020知到APP妙手传译-实用手语
  7. freemarker类型转换
  8. 在Linux下玩魔兽争霸——wine配置
  9. 数组排序sort方法
  10. 如何解决网站被黑客攻击-深夜一次网站被攻击瘫痪