设计模式之Visitor——送礼篇

来源:互联网 发布:windows 10 th2 编辑:程序博客网 时间:2024/05/16 09:29
    今年过年不收礼,收礼只收脑白金。听到这暗示性的广告词,我的脑袋突然一亮。因为最近因为要办某事,必须要给单位的领导要表示一下。到底送什么,还真让人头痛,还好有脑白金,奶奶的。。。,腐败啊,罪过!

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

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

public interface Leader{

  public void backInfo(Visitor 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 present;

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

    present= present;

  }

 

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

    return present;

  }

 

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

  public void backInfo(Visitor visitor) {

    visitor.visitFirstHand (this);  //对拜访人反馈办事情况

  }

}

B:二把手

public class SecondHand implements Leader {

  private String present; 
    
  public SecondHand (String present) {//二把手的构造函数

    present= present;

  }

 

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

    return present;

  }

 

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

  public void backInfo(Visitor visitor) {

    visitor.visitSecondHand (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).backInfo(this);     //不同的领导的反馈信息
          }

    }

    public void visitFirstHand (FirstHand first) {

      System.out.println("送的礼是:"+ first.getPresent()+",你的事办好了!");

    }

    public void visitSecondHand (SecondHand second) {

      System.out.println("送的礼是:" + second.getPresent()+",你的事不好办!");

    }

}

3、编写测试类:

public class test {

   public static void  main(String args[]){

     Visitor visitor = new visitMe (); 

     Collection list = new ArrayList();

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

     list.add(new SecondHand ("一斤小点心"));

     visitor.visitCollection(list);

 

   }

 

4、说明:

A代码只用来学习Visitor模式,要运行的话,必须要做一点改动。

BFirstHandSecondHand只是一个个具体实现,实际上还可以拓展为更多的实现,整个核心奥妙在backInfo方法中,在遍历Collection时,通过相应的accept方法调用具体类型的被访问者。这一步确定了被访问者类型

C:使用访问者模式是对象群结构中(Collection) 中的对象类型很少改变,也就是说领导很少变化。
  5、特别感谢:
     感谢kvill 网友的所提的意见,为了更好的说明问题,我将例子进行了改动。另外要说明的是:本文是站在我(Visitor)立场上来看问题,因此我关心的是事情所办的情况(也就是领导所给我的答复)。你已经给领导分别送去礼物了(领导初始化时),然后你再去一一拜访领导,领导答复你已经收到某某礼物了,事情办的如何等等。 如果是站在领导的立场,他关心的可就是索贿的问题(哈哈,不过也可以考虑如果是这样的话,如何实现)。

原创粉丝点击