java 板


LINE

※ 引述《naticom (踢踢~)》之銘言: : 最近開始看一些有關於design pattern的東西,感覺都不是很直覺會想出的方法 : Observer pattern 在講解的時候,幾乎大家都拿訂閱報紙當例子 : https://dotblogs.com.tw/joysdw12/archive/2013/03/13/96531.aspx : 例如這篇網誌 : 但我真的不太懂為什麼要用一個什麼oberver pattern拿來做這種事情比較好? : 直觀來說,我們建立一個報社class,裡面有個array儲存所有的讀者 : SubscribeNewspaper() : UnsubscribeNewspaper() : SendNewspaper() : 都是這個報社class的member function : 讀者class提供update() function : SubscribeNewspaper()基本上把新的讀者加入array : UnsubscribeNewspaper()把讀者踢出array : SendNewspaper()依序traverse array中的讀者,並且呼叫讀者的update() : 為什麼要拐個彎搞出個介面呢? : 還請前輩們指教,是不是我OO觀念太薄弱造成的orz 你這個只是『實作』細節,在精神上是沒什麼不一致的。 直接貼 Design Patterns 書上的 Intent Intent Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. 書上是用 GUI 程式當例子,一個 subject 變了,相關的元件都做出反應 例如數值的值會變,line bar 的長度會變。 把例子換成報紙訂閱不是不行,只是一般人對報紙的用法有既定印像 造成生理上無法接受他的說例。 回到原始的 subject 與 observers 的關係, subject 是被訂閱的對象,而 observers 是對 subject 的改變有興趣的對象。 若先不考慮 observer pattern,比較沒經驗的功程師可能會寫成這樣: target1.method9487(subject.a); if(subject.b) { target2.methodC8763(subject.c); } target3.methodX(subject); 這例子是表示,你的程式邏輯『緊密地』 讓 subject 與要做反應的 targets 綁在一起, 也就是所謂的 coupling。 要鬆綁這個關係,就要透過『導入間接層』來隔開, 也就是抽象化與一般化,實作上就會用 interface 或抽象類別、方法。 會把它重構成: 1. 所有的 target 都繼成某一個 interface X 2. 所有直接的 method call 都使用通一的名字 3. 為了避免直接、零散地傳遞參數,使用 param object 代替 interface X { methodX(Param p) } 所以,重新改寫後,會變成 target1.methodX(subject); target2.methodX(subject); target3.methodX(subject); 那,因為所有產生關係的 target 都有同樣介面了, 可以再把成簡化至 collection 內,例如: X[] targets = {target1, target2, target3}; 只要這樣子更新就行了 for (X target: targets) { target.methodX(subject); } 對 subject 來說,它就不用特別『關照』個別的 target 需要某個欄位 或某個狀態下才作用,只要通知他們有改變就行了。 然後,再把呼叫的對象 target 換成 observer 就是模式定義的型式 他們達到彼此的實作細節不互相影響,例如原本的: 這條件本來不是在 target2 內部,它現在被推回去 target2 內了: if(subject.b) { target2.method2(subject.c); } target2 methodX(subject) { if(subject.b) { methodC8763(subject.c) } } 你不用擔心改 subject 而弄壞 target2, 也不用擔心改 target2 需要連帶修改 subject 內實作的條件 針對 subject 提供 attach, detach interface X 改名 Observer 與把 methodX 換成 notify 完成重構後, 你的工作成果就跟 observer pattern 87% 像了。 其實 design pattern 就是由實際工作經驗粹取出來的精華, 不能只看它的結構,而是它要表達的 Intent 得抓住 (不然,有好多張長得差不多的 pattern 怎麼分得出它的異同!?) --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.241.57.74
※ 文章網址: https://webptt.com/m.aspx?n=bbs/java/M.1491620173.A.331.html ※ 編輯: qrtt1 (111.241.57.74), 04/08/2017 10:58:27 ※ 編輯: qrtt1 (111.241.57.74), 04/08/2017 11:01:51 ※ 編輯: qrtt1 (111.241.57.74), 04/08/2017 11:03:03
1F:推 johnny94: 寫的真好,推推 04/08 12:15
2F:推 eieio: 推 04/08 13:23
3F:推 naticom: 謝謝,寫得真是好 04/08 14:00
4F:推 v9290026: 受教了 04/10 18:51







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Soft_Job站內搜尋

TOP