S | M | T | W | T | F | S |
|
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | | |
|
这个方法的原文在http://blogs.teamb.com/craigstuntz/2008/10/01/37839/ 作者似乎讲的很罗嗦,不过如果看完后觉得它没有意义,最好看下原文或搜索下memoize,另外在这个实现里,作者的方法有点巧妙,不为了memoize也可以下载完整的代码看下。
我把它的示例代码简化了一下贴出来,再加上注释,方便大家看。
class function TfrmMemoize.SlowIncrement(ANum: integer): integer; //先是定义了一个需要缓存结果的函数
begin
Sleep(1000); //假设这个函数需要花费大量的时间,比如从网络上获取数据之类的,这里用等待一秒来模拟。
Result := ANum + 1;
end;
procedure TfrmMemoize.FormCreate(Sender: TObject);
begin
FMemoizedFunc := TMemoize.Memoize<integer,integer>(SlowIncrement); //这句执行后,FMemoizedFunc就好象是指代了SlowIncrement函数,对FMemoizedFunc的调用,也就是对SlowIncrement的调用,但是它缓存了函数的结果。
end;
//第一次点button1时,会等待一秒才出结果,而第二次点,则立即出现了
procedure TfrmMemoize.Button1Click(Sender: TObject);
var
Input: integer;
begin
if TryStrToInt(edtInput.Text, Input) then
edtOutput.Text := IntToStr(FMemoizedFunc(Input)); //如果showIncrement函数曾经用input参数计算过,就直接取回它的值,否则就进行实际的函数调用。
end;
用工具网站给代码加的高亮,在这用了几次复制粘贴格式有点乱了
完整代码在附件里。
这个方法的一个问题是,被memoize的函数只能有一个泛型参数,如果想幽雅的实现多个似乎是个挑战,也许以后有时间我会完善它
Attachment:
memoize_implementation_for_delphi.rar (3.01 K)
Download count 82
|
This blog was closed or you do not have permission to post comment.
|
|