2008-11-20 46 views
4

我正在編寫一個實現可觀察模式(而不是接口)的類,我正在考慮複製構造函數是否也應該複製監聽器。在複製構造函數中複製監聽器/觀察者

一方面,拷貝構造函數應該創建一個儘可能接近原始實例的實例,以便它可以在顯示上下文中換出。

另一方面,這將假設聽衆可以應付這種事情。

有什麼想法?有沒有最佳做法?

回答

3

答案是這取決於你想要發生什麼

有技術上的三件事情可以做:

  1. 複製什麼。任何觀察者都不會對新對象一無所知。
  2. 有新的對象本身添加到事情的老觀察員觀察名單。現有的觀察員會像舊時一樣對新對象作出迴應。
  3. 創建觀察新對象新觀察員,因爲只有老的老物件。新的觀察者將對新對象的變化做出反應,如舊對象對舊對象所做的那樣。

其他海報如果僅僅是因爲在複製構造做2或3表示該觀察者總是創建/複製是肯定是正確的:1)可能是優選的選擇。如果有必要,無所事事可以在稍後添加觀察員。

但是,可以想像在其他選項是正確的情況下。如果你想,響應給定類的任何情況下,無論怎樣創建一個觀察者,然後2)是正確的。如果你的觀察者爲這個對象做了特定的任務,並且不關心繫統的其他部分,那麼3)可能就是這樣。

通常最好考慮一下你的系統如何工作,而不僅僅是遵循規則。如果這不是您正在修改的代碼,請詢問所有者。如果你根本不知道你想要發生什麼,請選擇1)並稍後添加觀察者。

0

不要複製。

5

不要複製。聽衆不知道新對象,也不期望接收與之相關的消息。

1

我的偏好是不要複製聽衆

的聽衆都註冊了原來的對象上,而不是複製 - 如果你決定使用拷貝構造函數作爲原型模式的基礎上,那麼你會用相同的聽衆收聽幾乎每一個對象在系統中結束。

然而:與所有這些類型的問題,開始用最少的(即不復制),然後看看你的身體情況如何。如果你發現自己在構造對象後重復相同的代碼,每次使用該構造函數(比如說超過3-4次),那麼重新審視這個決定可能是有益的。