zytbwu
BlogJava
首頁
新隨筆
聯系
聚合
管理
隨筆 - 4 文章 - 4 trackbacks - 0
<
2007年3月
>
日
一
二
三
四
五
六
25
26
27
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
留言簿
(1)
給我留言
查看公開留言
查看私人留言
隨筆分類
Eclipse相關(1)
JAVA語言
XML(1)
設計模式(1)
隨筆(1)
隨筆檔案
2007年3月 (4)
文章分類
Eclipse相關
Java
Linux
專業知識
相關轉載
設計模式
收藏夾
界面
設計模式
Design Patterns
eclipse-plugins website
J道:Java解決之道
Ebook
Eclipse
Good Blog
TerryLee技術專欄
很好的一個blog,里面的設計模式講得很詳細,很不錯
老趙點滴
師兄的blog,有很多地方要向他學習。
Good IT WebSite
CSDN
Java
Java開源大全
挺不錯的一個網站,是個可以從中學習一下別人是怎么寫代碼的
中文JAVA技術網 -- 為Java愛好者服務
挺不錯的一個網站,是個可以從中學習一下別人是怎么寫代碼的
Linux
搜索
最新評論
1.?re: XmlBuddy插件配置過程
學一下。呵呵。
--alexhi
2.?re: Observer模式 學習筆記1
學校真好!
--Druze.libo
3.?re: Observer模式 學習筆記
呵呵,睡不著而已。
今天學校要注冊了,明天就要開學了~
--冰雪荒原
4.?re: Observer模式 學習筆記
這么早起來寫東西啊!真是勤奮 啊!向你致敬!
--lang
閱讀排行榜
1.?Observer模式 學習筆記1(1206)
2.?XmlBuddy插件配置過程(719)
3.?開博第一篇(173)
4.?初學XML(140)
評論排行榜
1.?Observer模式 學習筆記1(3)
2.?XmlBuddy插件配置過程(1)
3.?開博第一篇(0)
4.?初學XML(0)
Observer模式 學習筆記1
GOF的設計模式中是這樣描述Observer模式的意圖(intent)的:
定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新。
我自己的理解是:
??????? Observer模式定義了一種多個對象之間的一對多的相互依賴關系,當一個對象的狀態發生改變時,其他與之有關系的對象“看上去”都要相應采取行動。
試著用Observer模式寫了一些代碼,模擬灌籃比賽,運動員每次灌完之后,評委為他們打分。
在這里Player是Subject;
ChinesePlayer和USPlayer是ConcreteSubject;
Rater是Observer
DunkRater是ConcreteObserver
Player中的endPlaying方法就是Player的行為或(引起觀察者行為的)事件。
Rater中的rate方法是觀察者的響應行為。???????????
?????????
??1
public
?
abstract
?
class
?Player
??2
{
??3
????
protected
?String?name;
??4
????
protected
?
int
?height;
??5
????
public
?String?getPlayerName()
??6
????
{
??7
????????
return
?
this
.name;
??8
????}
??9
????
?10
????
public
?
int
?getPlayerHeight()
?11
????
{
?12
????????
return
?
this
.height;
?13
????}
?14
????
private
?ArrayList
<
Rater
>
?raterList?
=
?
new
?ArrayList
<
Rater
>
();
?15
????
?16
????
public
?
void
?addRater(Rater?rater)
?17
????
{
?18
????????
this
.raterList.add(rater);
?19
????}
?20
????
?21
????
public
?
void
?removeRater(Rater?rater)
?22
????
{
?23
????????
this
.raterList.remove(rater);
?24
????}
?25
????
?26
????
protected
?
void
?askForRating()
?27
????
{
?28
????????
for
(Rater?rater?:?
this
.raterList)
?29
????????
{
?30
????????????rater.rate();
?31
????????}
?32
????}
?33
????
?34
????
/**/
/*
?35
????這里不寫成dunk()是為了以后的擴展之用,因為可能現在開發的是灌籃比賽,
?36
????以后再加入其他類型的比賽,比如投籃。
?37
????可以采用策略模式來完成。
?38
????
*/
?39
????
public
?
void
?play()????
?40
????
{????
?41
????????
//
some?code?to?describe?play
?42
????}
?43
????
?44
????
public
?
void
?endPlaying()
?45
????
{
?46
????????askForRating();
?47
????}
?48
}
?49
?50
public
?
class
?ChinesePlayer?
extends
?Player
?51
{
?52
????
public
?ChinesePlayer(String?name)
?53
????
{
?54
????????
this
.name?
=
?name;
?55
????}
?56
????
?57
????
public
?
void
?play()
?58
????
{
?59
????????System.out.println(
this
.name?
+
?
"
?have?a?power?dunk
"
);?
?60
????}
?61
}
?62
?63
public
?
class
?USPlayer?
extends
?Player
?64
{
?65
????
public
?USPlayer(String?name)
?66
????
{
?67
????????
this
.name?
=
?name;
?68
????}
?69
????
?70
????
public
?
void
?play()
?71
????
{
?72
????????System.out.println(
this
.name?
+
?
"
?have?a?highflyer?dunk
"
);?
?73
????}
?74
}
?75
?76
public
?
abstract
?
class
?Rater
?77
{
?78
????
protected
?String?name;
?79
????
public
?
abstract
?
void
?rate();
?80
}
?81
?82
public
?
class
?DunkRater?
extends
?Rater
?83
{
?84
?85
????
public
?DunkRater(String?name)
?86
????
{
?87
????????
this
.name?
=
?name;
?88
????}
?89
????
?90
????
public
?
void
?rate()
?91
????
{
?92
????????
//
?TODO?自動生成方法存根
?93
????????
int
?score?
=
?(
int
)(Math.random()?
*
?
8
)?
+
?
2
;
?94
????????System.out.println(
this
.name?
+
?
"
:?
"
?
+
?score);
?95
????}
?96
?97
}
?98
?99
public
?
class
?DunkGame
100
{
101
????
public
?
static
?
void
?main(String[]?args)
102
????
{
103
????????Rater?rater1?
=
?
new
?DunkRater(
"
Kobe
"
);
104
????????Rater?rater2?
=
?
new
?DunkRater(
"
Jordan
"
);
105
????
106
????????Player?player1?
=
?
new
?ChinesePlayer(
"
Yao?Ming
"
);
107
????????Player?player2?
=
?
new
?USPlayer(
"
James
"
);
108
????????
109
????????player1.addRater(rater1);
110
????????player1.addRater(rater2);
111
????
112
????????player2.addRater(rater1);
113
????????player2.addRater(rater2);
114
????????
115
????????player1.play();
116
????????player1.endPlaying();
117
????????
118
????????player2.play();
119
????????player2.endPlaying();
120
????}
121
????
122
}
123
某一次打印出的結果如下:
Yao Ming have a power dunk
Kobe: 4
Jordan: 4
James have a highflyer dunk
Kobe: 7
Jordan: 5
??
?幾點討論:
1)在Player(Subject)中的那個raterList是否可以把private改為protected?
?? 我覺得改了不好,因為不應該把“用什么數據結構、何種方式保存Rater(Observer)”暴露給用戶。(客戶程序員,他們可以擴展Player這個抽象類),否則就違背了封裝性。
2)從面向對象的幾個原則來看Observer模式
??? a)把變化的部分封裝起來:
?????? 我們可以很好地擴展Player和Rater兩個部分,彼此沒有過多影響。因此Observer模式在方面做的還是很好的。
????? ConcretePlayer與ConcreteRater這間的聯系就是ConcretePlayer維護著一個注冊過的現有的Rater(Observer)的列表(這個列表的實現方式對于負責擴展地程序員應該是透明的),ConcretePlayer不知道它的監聽者具體是什么類型,只知道它們實現了Rater(Observer)的接口。
???????
??? b)面向接口編程而不是面向實現
????? 在客戶主程序中,只出現了三個具體的類,這樣的問題可以通過工廠模式解決。
????? 值得注意的一點,也是Head First in Design Patterns中對于這條原則的一個解釋:
??????
一直以來我們所說的面向對象設計中很重要的一條原則--面向接口編程,再加之繼承存在的種種問題,容易使人產生錯覺:使用關鍵字interface。
????? 實際上這條原則的一個等價的說法是
“面向SuperType編程”
。這里的SuperType的意思是接口或者超類。
????? 因此用abstract class并沒有違反這樣的原則,反而是遵守了。
3)語義上與實現上是否是相反的
???我不明白是翻譯問題還是我自己沒懂,總覺得GOF的描述中“自動”二字和“觀察者”會給讀者帶來誤解。
???原因如下:
??????? Observer模式描述的是這樣的一種情況:
????????當一個Subject的狀態發生變化或被觸發了一個事件的時候,在這個Subject上注冊的對象要依據這樣的變化或事件做出相應的反映,這些對象然后被稱之為Observers。
????????按照GOF的說法,從語義上來說應該是Observer主動響應了這個行為。
??????? 但在實現上應該是Subject調用Observer的這個響應行為,這就是我上面所說的“看上去”主動響應,實際上是被動地被Subject調用。
??????? 因此Observer和自動不免給人帶來誤解,站在Subject的角度上給這個模式取名,叫作通知者模式也許更好。
????????
????????
??????? 這個例子,以后會重構,將其他模式應用上去。在網上學習的過程中,知道Observer模式和責任鏈模式、MVC模式會有組合,但我現在還沒有學到,就先寫這些吧。
????????
???????
??????
??
?
????????
???????
?????????
?
posted on 2007-03-04 06:50
冰雪荒原
閱讀(1206)
評論(3)
編輯
收藏
所屬分類:
設計模式
FeedBack:
#
re: Observer模式 學習筆記 2007-03-04 08:38
lang
這么早起來寫東西啊!真是勤奮 啊!向你致敬!
回復
更多評論
#
re: Observer模式 學習筆記 2007-03-04 10:18
冰雪荒原
呵呵,睡不著而已。
今天學校要注冊了,明天就要開學了~
回復
更多評論
#
re: Observer模式 學習筆記1
2007-03-04 16:42
Druze.libo
學校真好!
回復
更多評論
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
Copyright ©2025 冰雪荒原 Powered by:
博客園
模板提供:
滬江博客
主站蜘蛛池模板:
亚洲欧美日本韩国
|
亚洲电影免费观看
|
黄页免费视频播放在线播放
|
最近最新MV在线观看免费高清
|
久久亚洲美女精品国产精品
|
亚洲AV无码精品色午夜果冻不卡
|
亚洲精品偷拍视频免费观看
|
亚洲精品国产精品乱码不卞
|
四虎永久在线精品免费一区二区
|
免费吃奶摸下激烈视频
|
黄色三级三级免费看
|
亚洲精品成人区在线观看
|
成人免费乱码大片A毛片
|
久久精品7亚洲午夜a
|
免费在线观看视频网站
|
亚洲人成人77777网站不卡
|
人妻视频一区二区三区免费
|
亚洲第一第二第三第四第五第六
|
free哆啪啪免费永久
|
亚洲综合色7777情网站777
|
日本一道高清不卡免费
|
免费无码又爽又黄又刺激网站
|
国产亚洲?V无码?V男人的天堂
|
91成人免费福利网站在线
|
亚洲欧洲第一a在线观看
|
性做久久久久久免费观看
|
国产亚洲综合视频
|
亚洲国产精品无码成人片久久
|
成人免费视频网站www
|
大桥未久亚洲无av码在线
|
在线观看国产区亚洲一区成人
|
亚洲国产精品自产在线播放
|
成人A毛片免费观看网站
|
久久久久亚洲精品日久生情
|
成年女人免费视频播放77777
|
视频免费1区二区三区
|
亚洲视频在线免费看
|
人人狠狠综合久久亚洲高清
|
久久久久久成人毛片免费看
|
亚洲日韩国产二区无码
|
亚洲另类图片另类电影
|