一个集合(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模式中,集合中所有的元素必须实现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中我们多了一个visit(Object o)方法,该方法就是使用反射的技术来动态决定当前被访问的对象。
但是该方法则要求Visitor中所有对元素操作的方法按照规定来命名,该方法实现如下:
这样,对于未处理的类型,使用默认的方法来处理。
代码部分就不贴了。。。
分享到:
相关推荐
章节介绍:1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立...10、设计模式之State 11、设计模式之Facade(外观) 12、设计模式之Interpreter(解释器) 13、设计模式之Visitor
创建模式: 设计模式之Factory 设计模式之Prototype(原型) 设计模式之Builder 设计模式之Singleton(单态) 结构模式: 设计模式之Facade(外观) 设计模式之Proxy(代理) 设计模式之Adapter(适配器) ...设计模式之Visitor
这是JAVA设计模式中属于行为模式的部分,包括Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor...
这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 工厂模式(Factory Pattern) 抽象工厂模式...
《java设计模式(第2版)》通过一个完整的java项目对经典著作design patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。本书创造性地将这些模式分为5大类别,以充分展现各个...
为了更好的网络共享 本人发布的资源一律免费 如有哪个收费了 请告知! 压缩包 包括常用的几种模式: 设计模式的原则 设计模式袖珍版之-Decorator(油漆工) 设计模式袖珍版之-Factory ...设计模式袖珍版之-Visitor
java 设计模式 java 设计模式是软件工程的基石,它们被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式可以让代码更容易被他人理解、保证代码可靠性、提高代码的重用性。 一、设计模式...
用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...
AbstractFactory ( 抽象工厂 ) FactoryMethod ( 工厂方法 ) Singleton ( 单态模式 ) Builder ( 建造者模式 ) Prototype ( 原型模式 ) Adapter ( 适配器模式 ) Bridge ( 桥接模式 ) ...Visitor ( 访问者模式 )
主要介绍了Java设计模式之访问模式(Visitor者模式)介绍,本文讲解了为何使用Visitor模式、如何使用Visitor模式、使用Visitor模式的前提等内容,需要的朋友可以参考下
至于第 14章则很快地浏览尚未介绍的设计模式,包括Bridge、Builder、Chain of Responsibility、Flyweight、Interpreter、Mediator、Memento、Prototype,Visitor。第1章还介绍了四个○○基本概念(抽象、封装、继承、...
至于第14章则很快地浏览尚未介绍的设计模式,包括Bridge、Builder、ChainofResponsibility、Flyweight、Interpreter、Mediator、Memento、Prototype,Visitor。第1章还介绍了四个○○基本概念(抽象、封装、继承、...
"Java 23种设计模式通解" 本文档总结了Java 23种设计模式的基本概念、分类、六大原则和详细实现。设计模式是软件工程的基石,它们被广泛应用于软件开发中,以提高代码的可重用性、可读性和可维护性。 设计模式的...
1. 设计模式 1.1 含义 1.2 作用 1.3 设计原则 1.4 分类 2. 简单工厂模式 (SimpleFactoryPattern) 3. 工厂方法模式 (Factory Method) 4. 单例模式 (Singleton) 5. 抽象工厂模式 (Abstract Factory) 6. ...
1、策略模式STRATEGY PATTERN 2、代理模式PROXY PATTERN 3、单例模式SINGLETON PATTERN ...18、访问者模式VISITOR PATTERN 19、状态模式 20、原型模式 21、中介者模式 22、解释器模式 23、亨元模式 24、备忘录模式
Factory(工厂模式)、Singleton(单态)、Builder(建造者模式)、...Mediator(中介模式)、Interpreter(解释器模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor(访问模式)、 Command(命令模式)。
23种java版设计模式源码案例.zip 0.目录 创建型模式(creational) 简单工厂(simplefactory) 动态工厂(dynamic) 抽象工厂(abstract) 单例模式(singleton) 建造者模式(builder) 原型模式(prototype) 结构型模式...
Java设计模式 (含有相关源码) Abstract Factory:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 Adapter:将一个类的接口转换成客户希望的另一个接口,使得原来由于接口不兼容而不能...
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 ...
获取到【文件夹】名称: abstract_factory_pattern 获取到【文件夹】名称: adapter_pattern 获取到【文件夹】名称: bridge_pattern 获取到【文件夹】名称: build_...获取到【文件夹】名称: visitor_pattern