2011-09-21 145 views
0

我有一個有幾個屬性的類。一些屬性可以被其他類改變,但是一些屬性依賴於其他屬性。例如,假設我的類有三個屬性:A,B和C.A和B可以由系統中的其他類更改,C等於A + B.該類生成屬性更改通知所以,當A或B發生更改時,會爲已更改的屬性(A或B)生成通知,並會爲C生成通知。 我有三個選項(任何其它?)這個問題的最佳設計模式是什麼?

1-創建一個普通的C屬性(帶背襯場)和在A的設定器和B添加代碼以改變C.

2-創建一個普通的C屬性並收聽我班內屬於我班的財產變更通知,並在A或B變更時更改C.

3-對C創建一個計算屬性沒有setter但是吸氣劑是A + B,在A(和B)的設定器,我火兩者的性質變化(或B)和C

哪一個是一個更好的設計模式(在C#中)?我個人喜歡設計編號2.

回答

1

聽起來像一個觀察者模式可能在這裏很有用。例如參見http://www.oodesign.com/observer-pattern.html。雖然搜索Observer模式將產生許多結果和其他示例,但更簡單一些,也是特定語言。

+0

觀察者模式是好的,在這種情況下,觀察者和Observable是同一個類。使用這種模式等於設計2,當類聽自己的財產變化通知,並因此觀察自己的變化。 – mans

0

我可能會用變化去2和3

你可以有一個計算的屬性(只吸氣劑),對C,使C = A + B的計算是隻在一個地方。

然後,根據您的選項2,您可以偵聽同一類中的屬性更改事件......但是當您檢測到A和B的PropertyChanged事件時,您只需要引發PropertyChanged事件爲C當時。

+0

你提到你想在一個地方進行C計算的事實是一個很好的觀點。我認爲我們可以通過編寫代碼來單獨實現這一點,C = A + B採用單獨的方法,並在檢測到A或B發生變化時調用。 – mans

+0

是的,這是真的,我沒有太多的選擇。 2的風險非常小,如果某些代碼在不通過屬性設置器的情況下更改A或B的後備字段,則C可能不同步,而計算出的屬性不能同步。有了這樣一個簡單的例子,雖然這可能是一個非常低的風險。 –

0

這裏的問題是,你正在試圖混合的方式,事情應該與微軟的方式逼你做的事情要做...... :)

但我咆哮拋開它認爲選項3聽起來乾淨。當然不是1,這是迄今爲止最糟糕的,我認爲訂閱自己的財產變更事件可能會導致一些時髦的問題,當一些可憐的SAP嘗試在未來維護代碼時將難以調試......

如果您在較高的水平想一想,你所提出的建議在3恰如其分地描述了什麼是在類發生的事情:

該性質的改變之類的觀察員應通知該財產C有任何時間也改變了(因爲它)。

0

2是最純粹的,因爲它使A,B和C保持分離,但它確實涉及屬性通知中字符串解析時的一些開銷。

如果這是一個簡單的屬性集,我會受到1的誘惑,因爲它們仍然是合理分開的,但更新更簡單。 3是最差的國際海事組織,因爲A + B正在複製代碼,無論如何都應該分開(C通知)。

相關問題