簡體   English   中英

Java Observable / Observer與僅傳遞引用

[英]Java Observable/Observer vs just passing references

我試圖了解一些概念。 假設您有一個JFrame,並且在JFrame中有兩個面板,我們將說left_half和right_half。 如果我單擊right_half中的按鈕,我想在left_half中進行一些更改。 問題是右半部分不知道左半部分存在。 因此,您可以告訴框架,但從技術上講,兩個面板都不知道框架也存在,對嗎? 框架可以更改面板,但是面板不能更改框架,所以在我看來。

因此,我將對框架的引用傳遞到面板中。 現在right_half可以調用Frame.setVariable(data),而Frame可以通過相同的方法說出left_half.setStuff(data)。 這對我來說似乎是錯誤的,我一直在尋找一種無需在層次結構上下傳遞引用的方法。

接下來,有人說“這就是可觀察的存在的原因!” 太酷了,我想自己。 然后,我發現了許多關於如何使用Observable的令人困惑的示例,這些示例根本沒有幫助。 最后,我看到了這一點,這很有意義。 http://www.javaquizplayer.com/blogposts/blogpost7.html但是,它具有以下內容:“ observable.addObserver(mainWindow);” mainWindow與上面的示例中的Frame等效,它必須傳遞引用以將Obserable附加到! 因此,即使使用Observable,也必須將引用向下傳遞到層次結構中?

似乎是錯誤的。 如果沒錯,那很好...我可以這樣。 但是,一旦所有背景知識都完成了,我的問題就很簡單:您應該如何在兩個面板之間傳遞數據? 如果答案是簡單的語言,我可以接受抽象的答案;如果代碼示例簡短且易於理解,我可以使用代碼示例。 我不是專業的Java程序員,我不能只搜索29個API頁面和1400行代碼,而突然了解它的工作原理……。 我去那

可觀察的模式(以事件偵聽器的形式)可以,並且是一種很好的做法。 您會看到,即使RightPanel知道某人可能正在監聽其所有事件,它也不知道是在監聽。 從技術上講,它可以遍歷所有偵聽器並使用反射來找出他們是誰。 現在, 將是一個壞習慣。

就這樣,RightPanel知道有人可能正在聽它,僅此而已。 組件始終知道有人可能正在監聽,因為整個Swing都基於它。 重要的是,RightPanel無需使用LeftPanel(或框架)即可進行編譯,並且與它完全分離,除非通過偵聽器接口。 不僅很酷,而且很標准。

附帶說明,您的類結構不必鏡像嵌套面板層次結構。 根據您的操作,可以從Frame的內部類控制左右面板的行為可能是完全好的。 (就個人而言,我將使用JPanel而不是JFrame,因為它可以提供更大的靈活性,但是可以很容易地對其進行重構)。 否則,您就有將您的View / Controller分成太多緊密耦合的類的風險,這將違反封裝並導致大量樣板代碼。 通常,我不編寫大型胖類,而是嘗試將其重構為較小的胖類。 搖擺通常是一個例外。 一個好肥胖的大類比一個密集耦合的類的迷宮好。 當然,除非您具有可重用的組件或某些功能,這些功能或功能可以清晰直觀地分離。 不只是幾個本身沒有意義的按鈕或復選框。 一些子組件位於組件樹中某個面板內的簡單事實不應成為主要因素恕我直言。

因此,我通常不嵌套JPanels。 我使用MigLayout並將所有組件變成同級。 味道問題! 我只是鼓勵您先查看MiGLayout,然后看看您是否喜歡它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM