设计模式、用Delphi描述-->Lock pattern

 

Lock pattern

起源

lock patternDelphi TStrings数据更新控制的基础。在本段后面将例举部分TstringsTstringList的代码

目的

为类提供一个临时的访问锁控制机制

动机

我们经常发现一个对象经常调度一个返回更改结果的通知。被调度的对象必须控制其内部状态,以同步对象数据。如果同时对一个对象进行多个更改操作,将会产生多个通知并产生一个并发的操作。此时在你的类中加入一个lock pattern的模式,从面提供一个临时锁控制机。从而避免不必要的通知。

我们通过Tbag类来学习:

TBag提供了collection的行为。每次更改Tbag将调度OnChange事件。如果我们一次对Tbag加入多个对象你将得到多个更改通知。一个图形组件可能会进行多次刷新操作。引入lock pattern在加入对象前打开Tbag的锁,操作完后关闭锁。如此,我将得到单一的更改通知。更好的办法是加入一个标志,比如:FUpdating

应用

以下是Tbag类部分代码: (仅显示部分相关代码)

 

type

  TBag = class (TObject)

  private

    FLockCnt: Integer;

  protected

    function Locked: Boolean;

    procedure SetLocking(Updating: Boolean);

  public

    procedure Lock;

    procedure UnLock;

  end;

 

implementation

 

procedure TBag.Lock;

begin

  Inc(FLockCnt);

  if FLockCnt = 1 then SetLocking(False);

end;

 

function TBag.Locked: Boolean;

begin

  Result := (FLockCnt <> 0);

end;

 

procedure TBag.SetLocking(Updating: Boolean);

begin

end;

 

procedure TBag.UnLock;

begin

  Dec(FLockCnt);

  if FLockCnt = 0 then SetLocking(True);

end;

 

Tbag说明:

·      FlockCnt保存锁机制的内部状态。FLockCnt = 0表示其处于非锁状态,其它值都表示其处于锁定状态。类Tbag通过LockUnlock来设置它的值。

·      LockUnlock提供了锁的接口,每一次调用都将引起锁的关态变化,并调用SetLocking方法。

·      SetLocking方法中有一个Updating的参数,Lock调用的参数为False,而Unlock调用的参数为True。对了,你可以在方法中插入一引起其它的代码,分配给它更多的操作表示它的锁状态的更改。.

·      Locked 返回类的锁状态。

注意:Lock Unlock必须同时使用,从而避免类保持在锁状态。明智的方法是使用try..finally块来保持Lock Unlock的同时调用。

 

一个典型的应用例子:

 

procedure TBag.Add(Item: Pointer);

begin

  { Add Item to internal structure }

  Change;

end

 

procedure TBag.AddItems(Items: TList);

begin

  Lock;

  { Add multiple items }

  try

    for I := 0 to Items.Count - 1 do

      Add(Items[I]);

  finally

    { use try..finally to make sure Unlock is called }

    Unlock;

  end;

end;

 

procedure TBag.Change;

begin

  if not Locked then

    if Assigned(FOnChange) then FOnChange(Self);

end;

 

procedure TBag.SetLocking(Updating: Boolean);

begin

  if Updating then { Bag has become unlocked }

    Change;

end;

Delphi实例:TStringTstringList

TStrings = class(TPersistent)

  private

FUpdateCount: Integer;

  Protected

procedure Exchange(Index1, Index2: Integer); virtual;

procedure SetUpdateState(Updating: Boolean); virtual;

public

  procedure BeginUpdate;

  procedure EndUpdate;

procedure Changed; virtual;

       procedure Changing; virtual;

展开阅读全文
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
<p> <span style="font-size:14px;color:#337FE5;">【为什么学爬虫?】</span> </p> <p> <span style="font-size:14px;">       1爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬IP识别验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!</span> </p> <p> <span style="font-size:14px;">       2如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站</span> </p> <p> <br /> </p> <span style="font-size:14px;color:#337FE5;">【课程设计】</span> <p class="ql-long-10663260"> <span> </span> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 网络请求:模拟浏览器的行为从网上抓取数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据存储:将提取到的数据存储到硬盘或者内存中。比如mysql数据库或者redis等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬效率低下等。因此我们又增加了两个章节来提高爬虫程序的灵活性,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别JS加密解密动态网页爬虫字体反爬识别等。 </li> <li class="" style="font-size:11pt;color:#494949;"> Scrapy和分布式爬虫:Scrapy框架Scrapy-redis组件分布式爬虫等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以分布式爬虫让多台机器帮助你快速爬取数据。 </p> <p style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 从基础爬虫到商业化应爬虫,本套课程满足您的所有需求! </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <br /> </p> <p> <br /> </p> <p> <span style="font-size:14px;background-color:#FFFFFF;color:#337FE5;">【课程服务】</span> </p> <p> <span style="font-size:14px;">专属付费社群+定期答疑</span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"><br /> </span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"></span> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值