設計模式之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模式,要運行的話,必須要做一點改動。
B:FirstHand,SecondHand只是一個個具體實現,實際上還可以拓展爲更多的實現,整個核心奧妙在backInfo方法中,在遍歷Collection時,通過相應的accept方法調用具體類型的被訪問者。這一步確定了被訪問者類型
C:使用訪問者模式是對象羣結構中(Collection) 中的對象類型很少改變,也就是說領導很少變化。
5、特別感謝:
感謝kvill 網友的所提的意見,爲了更好的說明問題,我將例子進行了改動。另外要說明的是:本文是站在我(Visitor)立場上來看問題,因此我關心的是事情所辦的情況(也就是領導所給我的答覆)。你已經給領導分別送去禮物了(領導初始化時),然後你再去一一拜訪領導,領導答覆你已經收到某某禮物了,事情辦的如何等等。 如果是站在領導的立場,他關心的可就是索賄的問題(哈哈,不過也可以考慮如果是這樣的話,如何實現)。