`
men4661273
  • 浏览: 275980 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java设计模式-Visitor(访问者)模式

    博客分类:
  • java
阅读更多
    visitor定义  
    作用于某个对象群中各个对象的操作. 它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作.
  在Java 中,Visitor 模式实际上是分离了collection 结构中的元素和对这些元素进行操作的行为
   
    参考:http://smartfool.iteye.com/blog/207092 总觉得他的代码实现有些问题,每次执行的都是默认的业务方法,所以修改了下

    话说有一个银行,有三个窗口,但是每个窗口的智能都是一样的,即都能办理所有的业务。因此每位来银行办理业务的人只要排队就是了,排到你了,就向业务员说明你要办理的业务,然后业务员根据你的业务选择不同的单据,打开不同的账本。
    业务员此时典型的工作流程是:

    if (service instanceof Saving){
    //存款
   ......
}else if (service instanceof Draw){
    //提款
   ......
}else if (service instanceof Fund){
    //基金
   ......
} 
......


于是每位业务员的桌面总是塞得满满的,更重要的是大量的时间都花在受理不同业务之间的切换,使得效率很低。

有没有方法能够使得业务员的工作效率提高呢?银行经理苦思冥想了半天,终于想出了一个好办法。他让每个窗口各负责一个业务,同时委任了一位访问者(Visitor),负责在客户进门时,询问他要办理什么业务,告诉他应该去哪个窗口办理。这样,每个窗口的业务员就只负责一项业务,减少了在不同业务间切换的时间耗费 ,效率大大提高。更重要的是,当某一项业务的处理流程发生变更时,不需要同时麻烦三个窗口的业务员,而只需要让处理这项业务的业务员进行修改就可以了 。

下面就来定义Visitor类,这个Visitor类实际上还办含了不同窗口受理员的职责,可以认为是银行的受理反应机制吧。
package visitor;

public class Visitor {
	public void process(Service service){
		// 基本业务
		System.out.println("基本业务");
	}
	public void process(Saving service){
		// 存款
		System.out.println("存款");
	}
	
	public void process(Draw service){
		// 提款
		System.out.println("提款");
	}
	
	public void process(Fund service){
		System.out.println("基金");
		// 基金
	}
} 


服务接口类
package visitor;

public interface Service {
	public void accept(Visitor visitor);
}



具体的服务类
存款:
  package visitor;

public class Saving implements Service {

	public void accept(Visitor visitor) {
		
		visitor.process(this);
	}

}



取款:
package visitor;

public class Draw implements Service {

	public void accept(Visitor visitor) {
	
		visitor.process(this);
	}

}



基金:
package visitor;

public class Fund implements Service {

	public void accept(Visitor visitor) {
	
		visitor.process(this);
	}

}



测试:被注释掉得部分是普通实现方式

package visitor;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Test {
    //访问者模式实现方法
	public static void main(String[] args) {  
        Service s1 = new Saving();  
        Service s2 = new Draw();  
        Service s3 = new Fund();  
          
        Visitor visitor = new Visitor();  
          
        s1.accept(visitor);  
        s2.accept(visitor);  
        s3.accept(visitor);  
    }  
	
	
	//普通实现方法
//	public static void main(String[] args) {
//      Service s1 = new Saving();  
//      Service s2 = new Draw();  
//      Service s3 = new Fund(); 
//      
//      //要办理业务的三个客户队列
//      List<Service> list = new ArrayList<Service>();
//      list.add(s1);
//      list.add(s2);
//      list.add(s3);
//      
//      Iterator<Service> it = list.iterator();
//      while(it.hasNext()){
//    	  Service s = it.next();
//    	   if (s instanceof Saving){  
//       	    System.out.println("存款");
//
//       	}else if (s instanceof Draw){  
//       	    System.out.println("取款");
//
//       	}else if (s instanceof Fund){  
//       	    System.out.println("基金");
//       	}   
//    	  
//      }
//      
//   
//
//	}
	
}


Visitor模式实际上是利用的语言本身的特性,见Vistor类的各个函数,通过不同的参数来自动查找相应的处理函数。

采用Visitor的好处如上面说到的那样,当需要改变其中一项业务的处理时,不需要每个地方都进行修改,而只需要改动Visitor类中相应的处理函数就可以了。也就是说它适合于业务处理时常发生变动的情况。

当然,Visitor也有它自身的限制。它不适合于业务数量的经常变化,因为一旦新增或删除一些Service时,需要对visitor进行相应的增删。也就是说具体Service与Visitor是耦合的。



  • 大小: 52.5 KB
分享到:
评论

相关推荐

    33种JAVA设计模式DEMO

    访问者模式(Visitor Pattern) 4 J2EE 模式 这些设计模式特别关注表示层。这些模式是由 Sun Java Center 鉴定的。 MVC 模式(MVC Pattern) 业务代表模式(Business Delegate Pattern) 组合实体模式(Composite ...

    JAVA设计模式之行为模式

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

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

    《java设计模式(第2版)》通过一个完整的java项目对经典著作design patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。...第29章 访问者(visitor)模式 278

    java版本二十三种设计模式.zip

    &lt;!-- TOC --&gt; - 23种设计模式 - 工厂方法模式(Factory Method) ... - 访问者模式(Visitor) - 命令模式(Command) - 解释器模式(Interpreter) - 迭代器模式(Iterator) - 备忘录模式(Memento) - 状态模式(S

    Java高手真经 - Java Web系统设计与架构 源代码(一)设计模式

    Java高手真经 - Java Web系统设计与架构 源代码(一)设计...pattern/src/behavior/visitor //13.9访问者模式 pattern/src/behavior/mediator //13.10中介者模式 pattern/src/behavior/interpreter //13.11解释器模式

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

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

    java设计模式教程+源代码

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

    用Java实现23种设计模式

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

    访问者模式(Visitor)原理图

    访问者模式(Visitor Pattern)是GoF提出的23种设计模式中的一种,属于行为模式。它表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。从定义可以看出,...

    研磨设计模式-part2

    完整清晰版,完美书签. 《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义...第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    研磨设计模式-part4

    完整清晰版,完美书签. 《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义...第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    研磨设计模式-part3

    完整清晰版,完美书签. 《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义...第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    design-pattern-java.pdf

    算法的封装与切换——策略模式(四) 模板方法模式-Template Method Pattern 模板方法模式深度解析(一) 模板方法模式深度解析(二) 模板方法模式深度解析(三) 访问者模式-Visitor Pattern 操作复杂对象结构——...

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

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

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

    1. 设计模式 ...13. 访问者模式 (Visitor Pattern) 14. 迭代器模式 (Iterator Pattern) 15. 享元模式 (Flyweight Pattern) 16. 桥接模式 (Bridge Pattern) 17. 观察者模式 (Observer Pattern)

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

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

    23种java设计模式

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

    单例模式源码java-DesignPattern:在个人自学阶段的23种设计模式代码的全部实现,全部使用Java编写,其中还包括各个设计模式在

    在个人自学阶段的23种设计模式代码的全部实现,全部使用Java编写,其中还包括各个设计模式在源码中的使用,每种设计模式都举了一个简单的小例子来进行实现,并加以注释 包名解释 一、DesignPattern 1.1 创建型模式 ...

    超市管理系统java源码swing-king-design:23种java设计模式

    超市管理系统java源码swing 设计模式 0.目录 创建型模式(creational) 简单工厂(simplefactory) 动态工厂(dynamic) 抽象工厂(abstract) ...访问者模式(visitor) 1.介绍 1.1 创建型模式(creational) 简单工

    Java设计模式(含代码)

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

Global site tag (gtag.js) - Google Analytics