2008-09-19 73 views
2

面向對象環境中最基本的任務是在對象上執行一個方法。要做到這一點,你必須有一個對你調用該方法的對象的引用。建立此引用是否將對象作爲參數傳遞給調用對象的構造函數(或初始化方法)的正確方法?消息在對象之間傳遞 - 如何引用目標對象?

如果對象foo調用到對象bar,是正確的說法(在僞代碼):

bar = new barClass() 
foo = new fooClass(bar) 

,如果你需要傳遞的信息來回會發生什麼?你需要一種方法來註冊目標對象嗎?

foo = new fooClass() 
bar = new barClass() 

foo.register(bar) 
bar.register(foo) 

有沒有解決這個問題的模式?

回答

2

一般來說,依賴注入是要走的路。如果你只是在談論兩個對象通信,然後將一個實例作爲參數傳遞給另一個,就像在第一個例子中一樣。傳入構造函數確保引用始終有效。否則,你必須進行測試以確保註冊已被調用。你也需要確保多次調用註冊不會產生不利影響。

如果你想要一個控制對象,其他對象註冊事件會怎麼樣。然後可以使用Register方法(可以添加到委託)。

Observer Pattern

0

那麼,根據消息的級別,你可以實現一個消息服務。對象監聽消息,或在某個MessageProvider上註冊爲MessageListener。

如果兩個對象具有相互引用,那麼最終會產生循環依賴關係,在大多數情況下,我認爲這會導致不良。

+0

謝謝!如果你有許多對象可以響應的消息,這將是有意義的。我對兩個物體相互緊密耦合並相互交談的一般情況更感興趣。 OOP-101類型的東西。 :) – 2008-09-19 04:58:51

3

依賴注入框架如SpringGuice通過使用可在第一次需要時解析消息的接收者的代理提供了Java中的循環依賴關係的解決方案。然而,這不是一個普遍適用的面向對象模式。

+0

謝謝!我花了一點時間來看待Spring,但並不多。我一定會深入瞭解一下。 – 2008-09-19 06:05:08

0

你的一個對象類型可能是其他的工廠。當富poops了一個新的酒吧,連接已經作出:

foo = new Foo(); 
bar = Foo.Poop(); 

function Foo::Poop() 
{ 
    bar = new Bar(this); 
    myChildren.Add(bar); 
    return bar; 
} 

bar.SayHiToParent(); 
foo.SayHiToChildren(); 
0

我認爲,這在很大程度上取決於精確的關係是兩個物體之間的東西。