不知正在閱讀本文的你可聽到了這首《最浪漫的事》?----我能想到最浪漫的事,就是和你一起慢慢變老.......
聽聽這首歌,真的好浪漫啊。看看身邊的朋友都已經Find到了自己的對象了,而我自己還孤身一人。真的好羨慕他們的浪漫。在這里我就發發牢騷,給大家講一個浪漫而又凄慘的愛情故事吧!
我有個同學叫張三,自打他找了他所謂的“寶貝”后,他倆那股曖昧和親熱勁啊真讓人受不了。到那都是寶貝啊,親愛的啊叫個不停。讓人聽了全身啊都麻了,真是有的像癩蛤蟆爬花椒樹:肉麻麻的。
這個世界上的人啊太多了,帥哥也特別的多,正好我同學也算是一個帥哥吧,不過他和別的人可不一樣,脾氣好,對人好,從不發牢騷,也從不和別人計較。還樂意助人,心胸廣闊............這如果從面向對象的思想來看,好象可以進行抽象吧,提取共性(他和別的帥哥都有的特征,如女孩高興和不高興的時候,他們該是什么反映?):
1
package DesignPattern.Observer;
2
3
import java.util.EventListener;
4
5
/** *//**
6
* 事件監聽者接口--繼承于EventListener
7
* 所有的監聽對象都繼承于此接口
8
*/
9
public interface EmotionListener extends EventListener
{
10
/** *//**
11
* 當女朋友高興的時候我將會做什么?
12
* @param e--情感事件(事件對象)
13
*/
14
void whatCanIdoWhenGirlHappy(EmotionEvent e);
15
16
/** *//**
17
* 當女朋友不高興的時候我將會做什么?
18
* @param e--情感事件(事件對象)
19
*/
20
void whatCanIdoWhenGirlSad(EmotionEvent e);
21
}
仔細觀察發現,上面的帥哥抽象出得接口里方法帶有EmotionEvent類型的參數,這是什么東西?不好意思,上面忘說了,我在這里補充,EmotionEvent就是我這同學在認識了他女朋友后兩個人發生了感情,然后產生的情感事件(EmotionEvent),這東西可強大了,一下子就把兩個人關聯到一塊了,我們看看他的定義:
1
package DesignPattern.Observer;
2
3
import java.util.EventObject;
4
5
/** *//**
6
* 情感事件--繼承于事件對象(EventObject)
7
* 事件對象
8
*/
9
public class EmotionEvent extends EventObject
{
10
public EmotionEvent(Object source)
{
11
super(source);
12
}
13
private static final long serialVersionUID = 1L;
14
}
15
正如前面所說,我這天下啊也算是帥哥的一種,那是不是他就應該實現于上面抽象出的帥哥(事件監聽)接口呢?答案是肯定的。好,那我們下面就來看看這位從不和別人鬧矛盾的善良帥哥"張三"同志,當女孩子不高興或是高興的時候他是怎么做的呢?
1
package DesignPattern.Observer;
2
3
/** *//**
4
* 事件監聽者--監聽對象
5
* 響應事件源(Girl)發起的事件對象(情感事件-EmotionEvent)
6
*/
7
public class HandSome implements EmotionListener
{
8
9
private String name;
10
public String getName()
{
11
return name;
12
}
13
14
public void setName(String name)
{
15
this.name = name;
16
}
17
18
public HandSome(String name)
{
19
super();
20
this.name = name;
21
}
22
23
/** *//**
24
* 當女朋友高興的時候我將會做什么?
25
* @param e--情感事件(事件對象)
26
*/
27
public void whatCanIdoWhenGirlHappy(EmotionEvent e)
{
28
Object o = e.getSource();
29
Girl girl = (Girl)o;
30
System.out.print(name + "說:" + girl.getName());
31
System.out.println(",你高興, 我也很高興!!!");
32
}
33
34
/** *//**
35
* 當女朋友不高興的時候我將會做什么?
36
* @param e--情感事件(事件對象)
37
*/
38
public void whatCanIdoWhenGirlSad(EmotionEvent e)
{
39
Object o = e.getSource();
40
Girl girl = (Girl)o;
41
//
42
System.out.print(name + "說:" + girl.getName());
43
System.out.print(",你不高興, 我也會不高興的。");
44
System.out.println("寶貝,甭怕,你不高興的時候我會逗你開心的。");
45
}
46
}
哦,原來他是這樣的啊。女孩子高興的時候一起高興,不高興的時候,想盡一切辦法逗女孩子開心。哎呀,慚愧啊,怪說不得我找不到女朋友的,因為我不會逗女孩子開心。一個人孤單的生活,這問題嚴重的呢,看來得找個時間找這老同學學習學習,向其請教怎么逗女孩子開心。
在上面一直提到的還有個美女怎么沒看到(張三的“寶貝”),那我們來看看這個大美女到底長什么樣,把我們張三都給迷倒了。
1
package DesignPattern.Observer;
2
3
import java.util.ArrayList;
4
import java.util.List;
5
6
/** *//**
7
*事件發起者--事件源
8
*/
9
public class Girl
{
10
11
public Girl(String name)
{
12
super();
13
this.name = name;
14
}
15
private String name;
16
public String getName()
{
17
return name;
18
}
19
20
List<EmotionListener> boyFriends=new ArrayList<EmotionListener>();
21
}
好象這位大美女很小氣,只是告訴了我們她的名字,以及她的男朋友(在boyFriends集合里?不是吧,還用集合,不會她想實現一妻多夫吧?。】植?......).其實他也不是很小氣的,她悄悄的告訴了我,他說人們談戀愛吧,個誰在一起都有可能的,或許某個時候兩個人說88就88了。呵呵,看來這個美女很現實哈。于此,那她是不是還具備找到男朋友和分手的方法呢(這是我猜的)?
1
/** *//**
2
* 女孩找到男朋友了---是誰?張三嗎?還是李四?
3
* @param listener--事件監聽對象
4
*/
5
public void addEmotionListener(EmotionListener listener)
{
6
this.boyFriends.add(listener);
7
HandSome hs=(HandSome)listener;
8
System.out.println(name+"說:好高興,我找到男朋友了,他叫:" + hs.getName() + ".");
9
}
10
11
/** *//**
12
* 女孩失戀了
.
13
* @param listener
14
*/
15
public void removeEmotionListener(EmotionListener listener)
{
16
this.boyFriends.remove(listener);
17
HandSome hs=(HandSome)listener;
18
System.out.println(name+" 說:親愛的" + hs.getName() + ",我不能沒有你,請不要離開我??!");
19
}
其實找到男朋友或是分手,這從事件模型上來看,也就是給事件源添加或注銷事件監聽對象。在JAVA的AWT事件模型里,事件源發起事件,事件監聽者接收到發出的事件對象,并做相應的處理。而本文中呢,則是事件源女孩(Girl)向她的男朋友事件監聽對象(HandSome)發起情感事件(EmotionEvent),她男朋友(HandSome)作為事件監聽對象(EmotionListener),應該響應事件源(Girl)發起的事件對象(情感事件-EmotionEvent)。Gril是如何向她的男朋友發起事件的呢?
1
public void fire()
{
2
//女孩自己就是事件發起者,也就是事件源
3
EmotionEvent e = new EmotionEvent(this);
4
for ( EmotionListener lis : boyFriends)
{
5
lis.whatCanIdoWhenGirlHappy( e );
6
lis.whatCanIdoWhenGirlSad( e );
7
}
8
}

Girl類的完整代碼
1
package DesignPattern.Observer;
2
3
import java.util.ArrayList;
4
import java.util.List;
5
6
/** *//**
7
*事件發起者--事件源
8
*/
9
public class Girl
{
10
11
public Girl(String name)
{
12
super();
13
this.name = name;
14
}
15
private String name;
16
public String getName()
{
17
return name;
18
}
19
20
List<EmotionListener> boyFriends=new ArrayList<EmotionListener>();
21
22
/** *//**
23
* 女孩找到男朋友了---是誰?張三嗎?還是李四?
24
* @param listener--事件監聽對象
25
*/
26
public void addEmotionListener(EmotionListener listener)
{
27
this.boyFriends.add(listener);
28
HandSome hs=(HandSome)listener;
29
System.out.println(name+"說:好高興,我找到男朋友了,他叫:" + hs.getName() + ".");
30
}
31
32
/** *//**
33
* 女孩失戀了
.
34
* @param listener
35
*/
36
public void removeEmotionListener(EmotionListener listener)
{
37
this.boyFriends.remove(listener);
38
HandSome hs=(HandSome)listener;
39
System.out.println(name+" 說:親愛的" + hs.getName() + ",我不能沒有你,請不要離開我?。?/span>");
40
}
41
42
public void fire()
{
43
//女孩自己就是事件發起者,也就是事件源
44
EmotionEvent e = new EmotionEvent(this);
45
for ( EmotionListener lis : boyFriends)
{
46
lis.whatCanIdoWhenGirlHappy( e );
47
lis.whatCanIdoWhenGirlSad( e );
48
}
49
}
50
}
51
女孩自己就是事件發起者,也就是事件源,通過調用監聽對象的方法把自己的信息(情感事件EmotionEvent)傳遞到心愛的男朋友處,接下來我們就來看看他們兩的浪漫愛情故事吧!
1
public class TestObserver
{
2
public static void main(String[] args)
{
3
4
//創建事件源對象--“寶貝”
5
Girl g = new Girl("寶貝");
6
//創建事件監聽對象
7
EmotionListener listener = new HandSome("張三");
8
//將響應者注冊到事件源
9
//(將上面創建的帥哥(“張三”)設定為叫“寶貝”的這個美女的男朋友)
10
g.addEmotionListener(listener);
11
g.fire();
12
}
13
}
幾個月后,他們的感情發生了問題,所謂的日久生情,日久也生疏。張三為了愛情的延續,以后的家庭生活,每天早出晚歸的工作。兩個人的感情淡了,正在這個時候,暗戀"寶貝"許久的 “周末”行動了,他假如了寶貝和張三的生活,成為了第三者,在寶貝的生活里就有了兩個男人,而對她都是一樣的好。
1
public class TestObserver
{
2
public static void main(String[] args)
{
3
4
//創建事件源對象--“寶貝”
5
Girl g = new Girl("寶貝");
6
//創建事件監聽對象
7
EmotionListener listener = new HandSome("張三");
8
//將響應者注冊到事件源
9
//(將上面創建的帥哥(“張三”)設定為叫“寶貝”的這個美女的男朋友)
10
g.addEmotionListener(listener);
11
//第三者加入
12
EmotionListener lis = new HandSome("周末");
13
g.addEmotionListener(lis);
14
g.fire();
15
}
16
}
我真的很佩服,帥哥就是帥哥,說話都是一樣,完全是從一個模型里套出來的。哎,看來我要學的還真多啊。說到這里,想想我的老同學張三啊,命苦啊,為了愛情整天忙碌的工作得到的確是冷落了心愛的“寶貝”,造成了第三者的加入,這時已是后悔...."這一切都是我錯了,冷落了人家,或許也不是我的錯,是她花心吧。不管怎樣,她都接受別人了我還能???" 張三說:最后做出決定,離開他的“寶貝”:
1
//這個善良的張三見女孩子多了好象開始花心了
2
//或許是應該張三冷落了他才會引起第三者的加入
3
//張三很后悔,決定離開了他的"寶貝"
4
g.removeEmotionListener(listener);
當張三離開后,寶貝好象也后悔了,不想張三離開他:
總上所述,其實我們已經演繹了一個面向對象的設計模式--觀察者模式,事件模型就是觀察者模式的一種體現。本文只是趣味性的簡單解說了一下事件模型的實現過程,要深入學習面向對象設計模式請查看相關書籍或資料。
哎,原本浪漫的愛情故事最終卻......,慚愧?。∥覀儙洑獾膹埲F在會做什么?會不會因為"寶貝"的請求又回到她身邊呢?還是徹底忘去舊愛,開始新的生活?要知詳細請關注下回分解。