`

JAVA设计模式之Visitor模式

阅读更多

一个集合(Collection)中,可以包含一个Car,也可以包含一个Cat,对于不同类型的元素,他们的行为也不尽相同,比如,Car可能有start()行为,而Cat可能有eat()的行为。可是对于Collection来说,不管你是Car,还是Cat,取出来的都是Object,那么我们如何知道取出来的是什么呢?

我们可能会如下操作:

Iterator itor = collection.iterator();

while(itor.hasNext()){

Object o = itor.next();

if(o instanceof Car){

((Car)o).start();

}else if(o instanceof Cat){

((Cat)o).eat();

}

}

这是你应该可以看出这种方式可能会出现的问题,假如现在Collection中放入了成千上万个不同类型的对象,也就意味着你需要成千上万个if else。这时,我们是否需要考量一下,我们的设计。。。

Yes!Visitor设计模式,就可以很好地解决这个问题。

Visitor设计模式,可以将一个集合中的元素和对各个元素的操作(行为)进行分离。首先我们看看Visitor设计模式中需要哪些组件来完成这个分离操作,如下图所示:

Visitor组件

可见,Visitor模式中,集合中所有的元素必须实现Visitable接口,Visitable接口中声明了唯一的方法,这个方法注入Visitor对象,而Visitor接口是整个Visitor模式的核心组件,因为他包含了所有实现了Visitable接口的元素的行为,这样,当每个元素在accept()方法中就可以使用Visitor接口中自己需要的方法了。

但是,我们也看到,Visitor模式中,集合中的每种元素必需要实现Visitable接口来注入Visitor对象,这样Visitable相当于限定了集合中的各种对象,必须要实现Visitable接口。对于像String,Float等原有类型,则我们需要对其进行重新封装,实现Visitable接口,这样,无疑增加了代码容量。

还有一点,Visitor模式将所有的行为都放在Visitor中,这样破坏了类的封装性,不太符合开闭原则。(Visitor模式缺点)。所以,使用Visitor模式的时候,应当慎重权衡。

当然,可以采用java反射技术来让Visitor模式变得更加灵活,使用反射技术后,集合中的元素将不再拘泥于实现了Visitable接口的类型,而可以是任意类型。使用了java反射技术后的组件模型如下图,

使用了反射后的Visitor组件

使用了反射技术后,在Visitor中我们多了一个visit(Object o)方法,该方法就是使用反射的技术来动态决定当前被访问的对象。

但是该方法则要求Visitor中所有对元素操作的方法按照规定来命名,该方法实现如下:

这样,对于未处理的类型,使用默认的方法来处理。

代码部分就不贴了。。。

分享到:
评论

相关推荐

    Java设计模式 设计模式介绍

    章节介绍:1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立...10、设计模式之State 11、设计模式之Facade(外观) 12、设计模式之Interpreter(解释器) 13、设计模式之Visitor

    JAVA设计模式chm文档

    创建模式: 设计模式之Factory 设计模式之Prototype(原型) 设计模式之Builder 设计模式之Singleton(单态) 结构模式: 设计模式之Facade(外观) 设计模式之Proxy(代理) 设计模式之Adapter(适配器) ...设计模式之Visitor

    JAVA设计模式之行为模式

    这是JAVA设计模式中属于行为模式的部分,包括Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor...

    33种JAVA设计模式DEMO

    这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 工厂模式(Factory Pattern) 抽象工厂模式...

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    《java设计模式(第2版)》通过一个完整的java项目对经典著作design patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。本书创造性地将这些模式分为5大类别,以充分展现各个...

    自己整理的java设计模式模式(袖珍版的哦)

    为了更好的网络共享 本人发布的资源一律免费 如有哪个收费了 请告知! 压缩包 包括常用的几种模式: 设计模式的原则 设计模式袖珍版之-Decorator(油漆工) 设计模式袖珍版之-Factory ...设计模式袖珍版之-Visitor

    用Java实现23种设计模式

    用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...

    java设计模式教程+源代码

    AbstractFactory ( 抽象工厂 ) FactoryMethod ( 工厂方法 ) Singleton ( 单态模式 ) Builder ( 建造者模式 ) Prototype ( 原型模式 ) Adapter ( 适配器模式 ) Bridge ( 桥接模式 ) ...Visitor ( 访问者模式 )

    Java设计模式之访问模式(Visitor者模式)介绍

    主要介绍了Java设计模式之访问模式(Visitor者模式)介绍,本文讲解了为何使用Visitor模式、如何使用Visitor模式、使用Visitor模式的前提等内容,需要的朋友可以参考下

    HeadFirst 设计模式java源代码

    至于第 14章则很快地浏览尚未介绍的设计模式,包括Bridge、Builder、Chain of Responsibility、Flyweight、Interpreter、Mediator、Memento、Prototype,Visitor。第1章还介绍了四个○○基本概念(抽象、封装、继承、...

    Head First 设计模式 JAVA源码

    至于第14章则很快地浏览尚未介绍的设计模式,包括Bridge、Builder、ChainofResponsibility、Flyweight、Interpreter、Mediator、Memento、Prototype,Visitor。第1章还介绍了四个○○基本概念(抽象、封装、继承、...

    Java设计模式,并加上个人理解

    1. 设计模式 1.1 含义 1.2 作用 1.3 设计原则 1.4 分类 2. 简单工厂模式 (SimpleFactoryPattern) 3. 工厂方法模式 (Factory Method) 4. 单例模式 (Singleton) 5. 抽象工厂模式 (Abstract Factory) 6. ...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    1、策略模式STRATEGY PATTERN 2、代理模式PROXY PATTERN 3、单例模式SINGLETON PATTERN ...18、访问者模式VISITOR PATTERN 19、状态模式 20、原型模式 21、中介者模式 22、解释器模式 23、亨元模式 24、备忘录模式

    23种java设计模式

    Factory(工厂模式)、Singleton(单态)、Builder(建造者模式)、...Mediator(中介模式)、Interpreter(解释器模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor(访问模式)、 Command(命令模式)。

    23种java版设计模式源码案例.zip

    23种java版设计模式源码案例.zip 0.目录 创建型模式(creational) 简单工厂(simplefactory) 动态工厂(dynamic) 抽象工厂(abstract) 单例模式(singleton) 建造者模式(builder) 原型模式(prototype) 结构型模式...

    Java设计模式(含代码)

    Java设计模式 (含有相关源码) Abstract Factory:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 Adapter:将一个类的接口转换成客户希望的另一个接口,使得原来由于接口不兼容而不能...

    JAVA经典设计模式大全

    1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 ...

    JAVA23种设计模式代码学习.zip

    获取到【文件夹】名称: abstract_factory_pattern 获取到【文件夹】名称: adapter_pattern 获取到【文件夹】名称: bridge_pattern 获取到【文件夹】名称: build_...获取到【文件夹】名称: visitor_pattern

    java 设计模式资料

    附件中是java实现全部的设计模式,包含代码和工程(jbuilder工程),值得收藏. 此目录里包括了一书中所有23种设计模式的实现(Java 版)源码 关于代码的几点说明: 1. 代码为根据个人对Design Pattern的学习理解写...

    23种设计模式java实现

    adapter bridge build chainOfResp command decorator factory iterator mediator observer proxy state visitor 设计模式,java实现,如有纰漏请指正,谢谢

Global site tag (gtag.js) - Google Analytics