JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 新手區 » Object/物件導向  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 Re:[實力測試]什麼是多型? [Re:BruceHsu]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2003-09-12 22:56 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
BruceHsu wrote:
我果然不是寫文章的料Black Eye
太丟臉了Cry

Big Smile 沒關係,你又不是要當記者或作家。

Decorator pattern 大概地說,是你要幫某個物件加上額外的權責或功能,但是不希望 client code 知道這一點,背地裡幫物件作一些額外的事,不管 client code 知道或不知道 decorator 的存在,都可以正常地操作,如同 decorator 根本不存在一樣。因為不希望 client code 受到 decorator 這一層的影響(有沒有安插 decorator 原來的程式碼應該都能跑),所以常用的作法就是 decorator 必須相容 decorated object 的介面,繼承或實做其介面使得 client 在面對 decorator 時具有通透性,對 client 來說,他以為他還是面對他所預期的物件。這裡面有個重點,也就是我之前提到重要的一點,就是 Java 本身多數的 method(but constructor/private method/static method)都具有多型能力,亦即當你以某種規格來看待一個物件時,你雖然不曉得到底面對的到底是哪一種物件,但是你一操作之,物件自然而然會作適當的是,這是一般所謂的"多型":同樣的操作會因物制宜。當你面對一個叫做 browser 的人且有足夠的智力,不管 browser 是 JSPtw 的站長,還是一個不認識的外國人,你向他比 Envelope,可以想見的是你將會遇到一連珠砲的髒話,台語也好或是洋文也好,更可能你會遭對方飽以老拳,這是說不準的,每個人的修養不同回應也不同,只要他看的懂你的 message 多多少少會有一些反應(反感),這就是多型,你不管你到底遇到誰,你想要惹它不高興,你比 Envelope 就是了(小心不要比到鱸鰻)。

回到 decorator,舉例來說,DataInputStream 繼承了 InputStream(是 InputStream 的一種表現),本來 InputStream 只提供一次讀一個 byte 的功能(一次讀進陣列裡的操作必須依靠這個功能正確),這也是其唯一的 abstract method,每個想當 InputStream 的物件一定要支援這個操作;而 DataInputStream 還額外提供一次讀取一個 primitive type 的 data 之操作,你可以不知道 int 到底是幾個 bytes,DataInputStream(and all derivative)會 take care 這些細節。Decorator 有一些可以觀察到的地方是其在建構時或建構之後通常需要為給他一個同類型的物件,因為 decorator 在作完他所提供的功能之前(或之後)需要將部分操作 delegate 給其他物件,以 DataInputStream 來說,建構時餵了一個 input stream s,當你執行 DataInputStream 的操作時,其必須先向 s 要資料,對 DataInputStream 來說只知道 s 是個可以一個一個 byte 讀取資料的 stream(但事實上也可能是個 DataInputStream 或 FileInputStream,比如當資料來源是檔案時),當 client 執行 readXXX 的操作時,DataInputStream 就從 s 依序讀取 sizeof(XXX) 個 bytes 的資料,然後稍微 shift data 並作組合,根本不在乎為給他的 s 到底是哪一種 input stream,FileInputStream 或 ZipInputStream 都好,反正實際上 s 個物件會負責把資料拿出來(從哪裡拿不管),這一點又是多型的表現。事實上如果當初餵給 InputStream 的 s 是個 ZipInputStream,那麼 DataInputStream 在向 s 要 byte data 時,s 本身會額外作些適當的工作,正如其名,他會把經過壓縮後的 data block 解壓縮,雖然他主要的功能是要提供一次把一個位於壓縮資料塊裡的 entry 拿出來,但是你還是可以把他當作最基本的 input stream 來使用,因為 ZipInputStream 也是一種 InputStream 一定會提供 read one byte 的操作。妙的是 ZipInputStream 本身也需要被餵一個 input stream t(ZipInputStream 也是 decorator),如同 DataInputStream 一樣,當你把他當作最原始的 input stream 一次只讀一個 byte,實際上都是 delegate 給 s/t 的某些更基本的操作並作些額外的處理(對 DataInputStream 來說,一次讀一個 byte 可以不作任何事直接交給 s 去作,對 ZipInputStream 來說則需要從 t 讀取適量的 data 來作解壓縮);從一開始的 DataInputStream 一路看下來,他拿到的 s 是個 ZipInputStream,而 s 拿到的 t 可能是個 FileInputStream,但是對 DataInputStream 來說他並不知情,也不以為意,當操作了 s.readInt method,他就連續從 s 身上讀 4 個 byte,而每次從 s 讀到的單一 byte 其實是 s 透過 t 從某個檔案讀取適量的 data 經解壓縮後得到還原後的資料串再一個一個 byte 拿出來的,這一連串的作用,於是你可以從一個 zip 壓縮檔裡讀出一個 int 的 data 出來,本來你拿到一個 DataInputStream 根本不知道是什麼東西(更不會知道這背後一連串的合作),你只是要拿出一個 int 大小的資料就是了,這過程依賴多型的機制,而 decorator pattern 做出了通透的性質。

詳細一點的討論,請自行參閱 Design Pattern 的相關書籍。


Duncan edited on 2003-09-12 23:11
reply to postreply to post

給我
辣味豆腐 其餘免談
話題樹型展開
人氣 標題 作者 字數 發文時間
64789 [精華] [實力測試]什麼是多型? BruceHsu 1745 2003-09-12 21:35
61463 Re:[實力測試]什麼是多型? swanky 20 2003-09-12 21:48
61240 Re:[實力測試]什麼是多型? BruceHsu 82 2003-09-12 21:57
61579 Re:[實力測試]什麼是多型? Duncan 2568 2003-09-12 22:56
57000 Re:[實力測試]什麼是多型? 183 2004-12-26 02:09
56904 Re:[實力測試]什麼是多型? leonz 13 2004-12-26 04:23
57391 Re:[實力測試]什麼是多型? caterpillar 325 2004-12-26 23:36
56358 Re:[實力測試]什麼是多型? roycliu 195 2005-01-08 15:38
51692 Re:[實力測試]什麼是多型? ylam 32 2005-07-04 22:21
51624 Re:[實力測試]什麼是多型? caterpillar 144 2005-07-05 18:43
51562 Re:[實力測試]什麼是多型? alien 784 2005-07-05 19:06
51535 Re:[實力測試]什麼是多型? caterpillar 1297 2005-07-05 20:32
51547 Re:[實力測試]什麼是多型? alien 1401 2005-07-06 01:23
10759 Re:[實力測試]什麼是多型? sample33 201 2015-09-22 07:31
51442 Re:[實力測試]什麼是多型? caterpillar 495 2005-07-05 20:42
51616 Re:[實力測試]什麼是多型? Duncan 258 2005-07-05 21:58
51275 Re:[實力測試]什麼是多型? ylam 218 2005-07-06 21:50
51279 Re:[實力測試]什麼是多型? Lan2 191 2005-07-06 21:57
51220 Re:[實力測試]什麼是多型? alien 286 2005-07-07 19:57
51611 Re:[實力測試]什麼是多型? ylam 9 2005-07-07 20:28
51203 Re:[實力測試]什麼是多型? alien 138 2005-07-08 00:05
51122 Re:[實力測試]什麼是多型? ylam 97 2005-07-08 17:20
51086 Re:[實力測試]什麼是多型? alien 269 2005-07-08 22:23
51114 Re:[實力測試]什麼是多型? Lan2 23 2005-07-08 19:31
61045 Re:[實力測試]什麼是多型? Duncan 481 2003-09-12 21:54
60813 Re:[實力測試]什麼是多型? BruceHsu 254 2003-09-12 21:55
60760 Re:[實力測試]什麼是多型? BruceHsu 239 2003-09-12 21:56
51037 Re:[實力測試]什麼是多型? ylam 20 2005-07-09 09:44
50968 Re:[實力測試]什麼是多型? alien 122 2005-07-10 00:05
51062 Re:[實力測試]什麼是多型? lkkll 175 2005-07-09 14:50
50966 Re:[實力測試]什麼是多型? alien 366 2005-07-10 00:46
50975 Re:[實力測試]什麼是多型? lkkll 52 2005-07-10 14:23
50841 Re:[實力測試]什麼是多型? lkkll 260 2005-07-10 14:39
50864 Re:[實力測試]什麼是多型? lkkll 220 2005-07-10 14:52
50527 Re:[實力測試]什麼是多型? caterpillar 464 2005-07-10 16:35
50825 Re:[實力測試]什麼是多型? lkkll 201 2005-07-10 15:35
50536 Re:[實力測試]什麼是多型? caterpillar 40 2005-07-10 16:21
50458 Re:[實力測試]什麼是多型? lkkll 54 2005-07-10 16:39
50288 Re:[實力測試]什麼是多型? caterpillar 127 2005-07-10 19:13
50240 Re:[實力測試]什麼是多型? lkkll 31 2005-07-10 21:23
60678 Re:[實力測試]什麼是多型? BruceHsu 43 2003-09-12 22:53
60852 Re:[實力測試]什麼是多型? Duncan 568 2003-09-12 23:06
60681 Re:[實力測試]什麼是多型? BruceHsu 567 2003-09-12 23:08
50292 Re:[實力測試]什麼是多型? caterpillar 74 2005-07-10 21:30
50241 Re:[實力測試]什麼是多型? lkkll 43 2005-07-10 22:45
50257 Re:[實力測試]什麼是多型? caterpillar 476 2005-07-10 22:57
50328 Re:[實力測試]什麼是多型? alien 668 2005-07-10 23:42
50259 Re:[實力測試]什麼是多型? caterpillar 165 2005-07-10 23:54
50236 Re:[實力測試]什麼是多型? alien 161 2005-07-11 00:02
50161 Re:[實力測試]什麼是多型? ylam 76 2005-07-12 20:07
49999 Re:[實力測試]什麼是多型? alien 117 2005-07-14 22:20
49330 Re:[實力測試]什麼是多型? fwen 72 2005-08-10 02:29
49849 Re:[實力測試]什麼是多型? alien 169 2005-08-10 09:59
62730 Re:[實力測試]什麼是多型? T55555 416 2003-09-13 00:30
60797 Re:[實力測試]什麼是多型? Yoshi 416 2003-09-13 00:41
60727 Re:[實力測試]什麼是多型? Duncan 789 2003-09-13 01:48
60587 Re:[實力測試]什麼是多型? caterpillar 0 2003-09-13 01:35
61494 Re:[實力測試]什麼是多型? Duncan 2583 2003-09-14 01:16
56050 Re:[實力測試]什麼是多型? 湯瑪士小火車 359 2005-01-07 15:37
61398 Re:[實力測試]什麼是多型? T55555 1346 2003-09-13 02:17
60884 Re:[實力測試]什麼是多型? Duncan 1680 2003-09-13 02:30
60724 Re:[實力測試]什麼是多型? Yoshi 1140 2003-09-13 02:47
60797 Re:[實力測試]什麼是多型? Duncan 1677 2003-09-13 02:59
60115 Re:[實力測試]什麼是多型? yysun 242 2004-02-06 08:08
60075 Re:[實力測試]什麼是多型? psmonkey 489 2004-02-06 19:15
60136 Re:[實力測試]什麼是多型? yysun 66 2004-02-06 19:42
57539 Re:[實力測試]什麼是多型? doris 333 2004-12-16 22:06
» JWorld@TW »  Java 新手區 » Object/物件導向

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8