設計模式、用Delphi描述-->Lock pattern (轉)
Lock pattern
起源:namespace prefix = o ns = "urn:schemas--com::office" />
lock pattern是中 TStrings資料控制的基礎。在本段後面將例舉部分Tstrings、TstringList的程式碼
目的
為類提供一個臨時的訪問鎖控制機制
動機
我們經常發現一個經常排程一個返回更改結果的通知。被排程的物件必須控制其內部狀態,以同步物件資料。如果同時對一個物件進行多個更改操作,將會產生多個通知併產生一個併發的操作。此時在你的類中加入一個lock pattern的,從面提供一個臨時鎖控制機。從而避免不必要的通知。
我們透過Tbag類來學習:
類TBag提供了collection的行為。每次更改,Tbag將排程OnChange事件。如果我們一次對Tbag加入多個物件,你將得到多個更改通知。一個圖形可能會進行多次重新整理操作。引入lock pattern後,在加入物件前開啟Tbag的鎖,操作完後關閉鎖。如此,我將得到單一的更改通知。更好的辦法是加入一個標誌,比如:FUpdating
應用
以下是Tbag類部分程式碼: (僅顯示部分相關程式碼)
type
TBag = class (T)
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透過Lock與Unlock來設定它的值。
· Lock與Unlock提供了鎖的介面,每一次都將引起鎖的關態變化,並呼叫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例項:TString、TstringList
TStrings = class(TPersistent)
private
FUpdateCount: Integer;
Protected
procedure (Index1, Index2: Integer); virtual;
procedure SetUpdateState(Updating: Boolean); virtual;
public
procedure BeginUpdate;
procedure EndUpdate;
procedure Changed; virtual;
procedure Changing; virtual;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990946/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 設計模式、用Delphi描述-->Reference Count pattern (轉)設計模式
- 設計模式、用Delphi描述-->Visitor模式 (轉)設計模式
- 設計模式、用Delphi描述-->Factory Method模式 (轉)設計模式
- 設計模式、用Delphi描述-->Abstract Factory模式 (轉)設計模式
- 設計模式、用Delphi實現---->Builder模式 (轉)設計模式UI
- 設計模式、用Delphi實現---->Singleton 模式 (轉)設計模式
- Delphi設計模式-Abstract Factory (轉)設計模式
- 設計模式-策略模式(strategy pattern)設計模式
- 設計模式-Template Method Pattern設計模式
- 設計模式之策略模式和狀態模式(strategy pattern & state pattern)設計模式
- 設計模式--裝飾模式(Decorator Pattern)設計模式
- 設計模式之代理模式(proxy pattern)設計模式
- 設計模式-裝飾模式(Decorator Pattern)設計模式
- 設計模式--建造者模式(Builder Pattern)設計模式UI
- 設計模式--原型模式(Prototype Pattern)設計模式原型
- 設計模式-狀態模式(State Pattern)設計模式
- 1/24 設計模式之策略設計模式 Strategy Pattern設計模式
- 設計模式之——Singleton pattern設計模式
- 設計模式之觀察者模式(Observer Pattern)設計模式Server
- C#設計模式——代理模式(Proxy Pattern)C#設計模式
- 設計模式之狀態模式---State Pattern設計模式
- JAVA設計模式之 代理模式【Proxy Pattern】Java設計模式
- 4/24 設計模式之命令設計模式 Command Pattern設計模式
- Delphi實用程式設計經驗二 (轉)程式設計
- 重識設計模式-建造者模式(Builder Pattern)設計模式UI
- 設計模式之裝飾器模式(decorator pattern)設計模式
- [Design Pattern With Go]設計模式-工廠模式Go設計模式
- 設計模式之單例模式(Singleton Pattern)設計模式單例
- 設計模式--抽象工廠模式(Abstract Factory Pattern)設計模式抽象
- 設計模式--工廠方法模式(Factory Method Pattern)設計模式
- 設計模式十: 生成器模式(Builder Pattern)設計模式UI
- C#設計模式-建造者模式(Builder Pattern)C#設計模式UI
- C#設計模式-原型模式(Prototype Pattern)C#設計模式原型
- C++設計模式——命令模式(command pattern)C++設計模式
- Java設計模式——單例模式(Singleton pattern)Java設計模式單例
- C++ 設計模式 裝飾模式(Decorator Pattern)C++設計模式
- 設計模式之組合模式---Composite Pattern設計模式
- JAVA設計模式之 裝飾模式【Decorator Pattern】Java設計模式