Observer *o = New Observer();
Subject *s = new Subject() ;
s->register(o);
//Is it a good practice to delete the observer in the unregister function?
//I feel it is not. As the Observer object might still be in use, for example ,
//it might be registered to another Subject.
s->unregister(o);
//So it is safe to rely on the client code to delete the object or rely on the smart pointer things
delete o;
我想確認我的上述理解對於誰應該刪除觀察者對象是否正確。註銷時應該刪除觀察者嗎?
想想你有觀察者觀察兩個不同主題的情況。除此之外,你在函數名稱中沒有提到的註銷函數中做的事情,所以你的函數被稱爲unregisterAndDelete,但是再一次,你有一個函數做兩個邏輯上分離的事情(註冊管理和資源管理),這是一個壞主意開始。 – LavaScornedOven 2011-05-31 11:23:31
另一種想法是:刪除對象時最有可能取消註冊(除非主題知道註冊的觀察者被刪除)。如果你可以在註銷函數或觀察者的析構函數中滿足nothrow保證,那麼你可能應該在觀察者的析構函數中調用unregister,但是作爲缺點,你應該保留觀察者註冊到的所有主題的觀察者列表您可以遍歷主題列表並從每個主題中取消註冊您的觀察者)。 – LavaScornedOven 2011-05-31 16:45:57