[英]What design pattern does this?
很久以前我做過一次,當時我遵循了一個設計模式。 現在,我需要再做一次,我真的不記得我以前是怎么做的,也想不出幫助我做這件事的模式。
我有一個包含大量變量/屬性的類。 有些是基於其他計算的,並且這些屬性之間會進行各種交叉計算。
當我第一次實例化時一切都很好 - 所有的值和計算都很好。 我的問題是,當一個值發生變化時,我希望從中派生的所有計算值都能根據新值自動更新。 如果我不需要,我不想手動編寫每個單獨的重新計算 - 每當這個類被更新或添加時,它就會成為很多開銷,試圖追蹤你需要傳播任何更改的所有位置你在做。
我想你跟着我。
無論如何,誰能想到是什么模式使這成為可能? 我發誓我曾經知道它。 估計變老了。
// Like this...
class foo
{
decimal A = 1233;
decimal B = 42;
decimal C = A / B; // I want this to update whenever
// the value of either A or B changes.
decimal D = 123;
decimal E = 321;
decimal F = D + E; // I don't want this one to change when
// A or B or even C for that matter changes,
// and I don't wan to have to cycle through
// all of the calculated values that don't
// need to change just for find the few that do.
}
觀察員。 您需要在模型上使用某種.Subscribe()
方法來注冊回調 - 在您的特定情況下,這些只是采用新值並基於該值重新計算其他一些值的函數。 只要你的編程環境有rxjs實現,我強烈建議堅持使用那個。 否則你會因為多線程和內存泄漏而受苦。
我建議避免在這里過度設計。 您作為示例提供的內容有 6 個成員,它們之間具有簡單的依賴關系,可以輕松地重新計算。 我確實理解這可能只是一個簡化的例子,所以讓我們的目標是例如 10-20 個成員,以及不需要數據庫查找或磁盤訪問的依賴項(作為較重的操作的一個例子)。
您可以將所有依賴項放入一個方法中(我們稱之為Update
),如果任何成員被修改,您將調用該方法。 為了不用擔心記得調用Update()
,您將所有成員移動到一個單獨的“狀態”類中:
class FooState
{
private int _a;
public int A
{
get { return _a; }
set
{
_a = value;
Update();
}
}
private int _b;
public int B
{
get { return _b; }
set
{
_b = value;
Update();
}
}
public double C { get; private set; }
// other members
private void Update()
{
C = A * B + 3;
// other updates
}
}
class Foo
{
private FooState _state;
public Foo()
{
_state.A = 1;
_state.B = 2;
Debug.Write($"C = {_state.C}");
}
}
你得到什么:
隨意實現“觀察者”模式並進行比較。
我不認為這種簡單的方法有名字。 不要將它與有點不同的“狀態”模式混淆。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.