看板 CSSE 關於我們 聯絡資訊
: : -- : ※ 發信站: 批踢踢實業坊(ptt.cc) : ◆ From: 210.208.46.43 : ※ 編輯: mgtsai 來自: 210.208.46.43 (02/10 06:25) : 推 tinlans:我有點好奇,你是不是讓 visitor 做太多事情了,並不一定 02/10 16:14 : → tinlans:所有的事情都要給 Accept() 轉呼叫的東西通通做完吧, 02/10 16:15 : → tinlans:反正會選用 visitor 的時候,已經決定破壞被 visit 對象 02/10 16:15 : → tinlans:的封裝性了,你可以把相關的資訊記錄在這兩者之外的地方。 02/10 16:16 : → tinlans:包括需要這些資訊才能完成的動作,也一併抽出 visitor。 02/10 16:17 我想封裝性並不全然消失 在java如果修飾子不寫上public | protected | private的話 就會是packaged 這樣一來,在不同的package中使用這個物件時,無法存取內部資訊 封裝性仍然存在的 舉例:House是原繼承樹,Visitor我把它省略了,Main則是另一個package使用到House的 主程式。 =House= package myAPI.Test; public class Unstable_node implements Node { // Unstable的設定值 int configurationValue; public void accept(Visitor v) { v.visit(this); } } =Main= package home.work; import myAPI.Test.*; public class Main { public static void main(String args[]) { Node n = new Unstable_node(); // Access Deny, 這邊編譯不會過,資訊的隱藏機制仍然存在 // 封裝性並沒有完全消失 n.configurationValue = 1; } } 最後補一下,如tinlans所說的 visitor不應該做太多的事情,如果需要共享資訊的話 應該把它們提煉到另一個物件供house, visitor來存取 : 推 YuYuHo:vistor visit house,我覺得vistor最大的缺點 02/10 16:18 : → YuYuHo:是帶給house太大的負擔 02/10 16:21 : → YuYuHo:打錯字了,是visitor,剛打完麻將回來,win~~ya~~ 02/10 22:52 : → YuYuHo:假如說house的內部節點其實是不穩定的型態,結果會造成 02/10 22:54 : → YuYuHo:visitor的介面也變得很不穩定,很容易就搞得一團亂 02/10 22:55 : → YuYuHo:通常採用visitor時,house本身的結構可能就很複雜了, 02/10 22:57 : → YuYuHo:這時候還要管理節點的分派策略,還要維持節點穩定, 02/10 23:01 : → YuYuHo:這表示house做好後就不能隨便更動,很容易牽一髮動全身. 02/10 23:02 請問不穩定的型態是什麼意義 是指需求改變?還是設計的失誤? 為什麼house做好後就不能更動,這和visitor有什麼直接的關係呢 如果不採用visitor的話,那麼原本要加在繼承樹上面的功能又該怎麼處理? 牽一髮動全身我同意 但是使用visitor pattern之後 動到的「全身」應該會比不用visitor pattern來得少吧? 抱歉,我實在是不懂YuYuHo的這段推文 照他的說法,visitor pattern看似限制住了house擴充或修改的彈性 但是我不這麼認為.... 不採用visitor的話,當初用visitor在繼承樹上面加入的功能又該怎麼辦? 還有什麼更好的主意嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.213.121
tinlans:其實我要說的破壞封裝性,是指 house 被迫 open 給 02/12 15:26
tinlans:visitor 的部分,因為 visitor 本身跟 house 是分離的。 02/12 15:27
H45:你說的沒有錯,我所要補充的是「封裝性」在另一個觀點來看,並 02/12 16:34
H45:沒有消失。 我想我們所描述內容的應該不會造成衝突 02/12 16:38