┆ 回首页
 
站内资源搜索:
┆ 将本文寄给朋友  

设计模式之Visitor——送礼篇

 

 


〖 作者:GaryFeng 〗〖 大小:20k 〗〖 发布日期:2006-04-07 〗〖 浏览:675 〗

 

     今年过年不收礼,收礼只收脑白金。听到这暗示性的广告词,我的脑袋突然一亮。因为最近因为要办某事,必须要给单位的领导要表示一下。到底送什么,还真让人头痛,还好有脑白金,奶奶的。。。,腐败啊,罪过!

    首先要对送礼的对象进行分析,单位有两个领导,一正,一副。因此给不同的领导送的礼也是不同的(哈,收入要和产出成正比吗),好了言归正传。

1、在这里,先把领导定义成一个接口类:

public interface Leader{
   //主要任务----收visitor(拜访者)的礼
   public void accept(Visitor visitor);

}

在把拜访者定义成另一个接口类:

public interface Visitor

{

   public void visitFirstHand(FirstHand first);  //拜访一把手(带的礼物)

   public void visitSecondHand(SecondHand second);  //拜访二把手(带的礼物)

   public void visitCollection(Collection collection);  //判断是拜访一把手还是二把手

}



2、下面我们要对这两个接口进行实现:


A:一把手

public class FirstHand implements Leader {

  private String value; //注意此处是String

  public FirstHand (String string) {//一把手的构造函数

    value = string;

  }
 

  public String getValue() { //获得礼物

    return value;

  }
 

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

  public void accept(Visitor visitor) {

    visitor.visitFirstHand (this);  //接收拜访人送的礼

  }

}



B:二把手

public class SecondHand implements Leader {

  private Float value; //注意此处是Float

  public SecondHand (Float string) {//二把手的构造函数

    value = string;

  }
 

  public Float getValue() { //获得礼物

    return value;

  }
 

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

  public void accept(Visitor visitor) {

    visitor.visitFirstHand (this);  //接收拜访人送的礼

  }

}



C:拜访人(我)

public class visitMe implements Visitor{

   public void visitCollection(Collection collection) {

      Iterator iterator = collection.iterator();

      while (iterator.hasNext()) {

               Object o = iterator.next();

         if (o instanceof Leader)         //判断要送给哪个领导

          ((Leader)o).accept(this);     //不同的领导进入不同的实现类

      }

    }

    public void visitFirstHand (FirstHand first) {

      System.out.println("送的礼是:"+ first.getValue());

    }

    public void visitSecondHand (SecondHand second) {

      System.out.println("送的礼是:" + second.getValue());

    }

}

3、编写测试类:

public class test {

   public static void  main(String args[]){

     Visitor visitor = new visitMe ();

     FirstHand present = new FirstHand ("十盒脑白金");

     visitor.visitFirstHand (present);
 

     Collection list = new ArrayList();

     list.add(new FirstHand ("十盒脑白金"));

     list.add(new SecondHand (new Float("一斤小点心"))); //为了说明不同,如要运行,要做类型转换。

     visitor.visitCollection(list);
 

   }
 

4、说明:
A:代码只用来学习Visitor模式,要运行的话,必须要做一点改动。
B:FirstHand,SecondHand只是一个个具体实现,实际上还可以拓展为更多的实现,整个核心奥妙在accept方法中,在遍历Collection时,通过相应的accept方法调用具体类型的被访问者。这一步确定了被访问者类型

C:使用访问者模式是对象群结构中(Collection) 中的对象类型很少改变,也就是说领导很少变化。

来源: http://garyfeng.blogchina.com/index.html


 严禁发表涉及封建迷信、国家政治等敏感问题的内容
 ■ 对本文的评价(带 * 为必填内容,400字以内)    严禁发表涉及封建迷信、国家政治等敏感问题的内容。

* 您的姓名 
您的电子邮件 
您的个人主页 

*
您的评价 

     

 ■ 以往的评价







以上文章版权由原作者所有。未经同意,不得将其任何一部分复制、转载、发布等未授权操作。


Java学习室 — 陈伟波个人主页
E-mail: zz3zcwb@sina.com
COPY RIGHT 2005