快速业务通道

深入浅出Java的访问者模式 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
dd the ability to do "Bee" activities: //另一个具体访问者角色 class Bee implements Visitor {   public void visit(Gladiolus g) {    System.out.println("Bee and Gladiolus");   }   public void visit(Runuculus r) {    System.out.println("Bee and Runuculus");   }   public void visit(Chrysanthemum c) {    System.out.println("Bee and Chrysanthemum");   } } //这是一个对象生成器 //这不是一个完整的对象结构,这里仅仅是模拟对象结构中的元素 class FlowerGenerator {   private static Random rand = new Random();   public static Flower newFlower() {    switch (rand.nextInt(3)) {    default:     case 0: return new Gladiolus();      case 1: return new Runuculus();     case 2: return new Chrysanthemum();    }   } } //客户 测试程序 public class BeeAndFlowers extends TestCase {   /*    在这里你能看到访问者模式执行的流程:    首先在客户端先获得一个具体的访问者角色    遍历对象结构    对每一个元素调用accept方法,将具体访问者角色传入    这样就完成了整个过程   */   //对象结构角色在这里才 组装 上   List flowers = new ArrayList();   public BeeAndFlowers() {    for(int i = 0; i < 10; i++)     flowers.add(FlowerGenerator.newFlower());   }   Visitor sval ;   public void test() {    // It’s almost as if I had a function to    // produce a Flower string representation:    //这个地方你可以修改以便使用另外一个具体访问者角色    sval = new StringVal();    Iterator it = flowers.iterator();    while(it.hasNext()) {     ((Flower)it.next()).accept(sval);     System.out.println(sval);    }   }   public static void main(String args[]) {    junit.textui.TestRunner.run(BeeAndFlowers.class);   } }

深入浅出Java的访问者模式(2)

时间:2011-01-07

四、双重分派

对了,你在上面的例子中体会到双重分派的实现了没有?

首先在客户程序中将具体访问者模式作为参数传递给具体元素角色(加亮的地方所示)。这便完成了一次分派。

进入具体元素角色后,具体元素角 色调 用作为参数的具体访问者模式中的visitor方法,同时将自己(this)作为参数传递进去。具体访问者模式再根据参数的不同来选择方法来执行(加亮的地方所示)。这便完成了第二次分派。

五、优缺点及适用情况

先来看下访问者模式的使用能否避免引言中的痛苦。使用了访问者模式以后,对于原来的类层次增加新的操作,仅仅需要实现一个具体访问者角色就可以了,而不必修改整个类层次。而且这样符合“开闭原则”的要求。而且每个具体的访问者角色都对应于一个相关操作,因此如果一个操作的需求有变,那么仅仅修改一个具体访问者角色,而不用改动整个类层次。

看来访问者模式确实能够解决我们面临的一些问题。

而且由于访问者模式为我们的系统多提供了一层“访问者”,因此我们可以在访问者中添加一些对元素角色的额外操作。

但是“开闭原则”的遵循总是片面的。如果系统中的类层次发生了变化,会对访问者模式产生什么样的影响呢?你必须修改访问者角色和每一个具体访问者角色……

看来访问者角色不适合具体元素角色经常发生变化的情况。而且访问者角色要执行与元素角色相关的操作,就必须让元素角色将自己内部属性暴露出来,而在java中就意味着其它的对象也可以访问。这就破坏了元

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号