設計模式之Visitor——送禮篇(原創)

設計模式之Visitor——送禮篇<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

今年過年不收禮,收禮只收腦白金。聽到這暗示性的廣告詞,我的腦袋突然一亮。因爲最近因爲要辦某事,必須要給單位的領導要表示一下。到底送什麼,還真讓人頭痛,還好有腦白金,奶奶的。。。,腐敗啊,罪過!

首先要對送禮的對象進行分析,單位有兩個領導,一正,一副。因此給不同的領導送的禮也是不同的(哈,收入要和產出成正比嗎),好了言歸正傳。

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)立場上來看問題,因此我關心的是事情所辦的情況(也就是領導所給我的答覆)。你已經給領導分別送去禮物了(領導初始化時),然後你再去一一拜訪領導,領導答覆你已經收到某某禮物了,事情辦的如何等等。 如果是站在領導的立場,他關心的可就是索賄的問題(哈哈,不過也可以考慮如果是這樣的話,如何實現)。

發佈了25 篇原創文章 · 獲贊 0 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章