在Delphi應用程序中,我們正在研究相關對象的大型結構。這些對象的一些屬性具有在運行時計算的值,我正在尋找一種方法來緩存更密集計算的結果。我使用的方法是在第一次計算私有成員時將值保存起來。下面是一個簡短的例子:高速緩存計算值的方法
unit Unit1;
interface
type
TMyObject = class
private
FObject1, FObject2: TMyOtherObject;
FMyCalculatedValue: Integer;
function GetMyCalculatedValue: Integer;
public
property MyCalculatedValue: Integer read GetMyCalculatedValue;
end;
implementation
function TMyObject.GetMyCalculatedValue: Integer;
begin
if FMyCalculatedValue = 0 then
begin
FMyCalculatedValue :=
FObject1.OtherCalculatedValue + // This is also calculated
FObject2.OtherValue;
end;
Result := FMyCalculatedValue;
end;
end.
用於計算更改的對象和緩存值應重新設置和重新計算的情況並不少見。到目前爲止,我們通過使用觀察者模式解決了這個問題:對象實現一個OnChange事件,以便其他人可以訂閱,當他們改變並重置緩存值時得到通知。此方法有效,但有一些缺點:
- 需要大量內存來管理訂閱。
- 當緩存值取決於大量對象(例如列表)時,它不能很好地擴展。
- 依賴關係並不是非常具體(即使緩存值僅取決於一個屬性,當其他屬性更改時它也會被重置)。
- 管理訂閱影響整體性能並且難以維護(對象被刪除,移動...)。
- 目前還不清楚如何處理計算取決於其他計算值。
最後問題:你能否提出其他方法來實現緩存的計算值?
即使標記爲'delphi',我也很有興趣知道是否已經開發出特定的模式。 – 2009-10-08 08:41:12
我添加了Delphi標籤,以便將建議限制爲靜態類型,而不是垃圾收集語言。 – Tihauan 2009-10-08 08:47:32