A TCollection és TCollectionItem osztályokból származtatott saját konténer osztályok alkalmazásával ki lehet aknázni az OOP által nyújtott előnyöket mint például a kollekcióba szervezett adatok belső integritásának védelme, vagy az adatok állapot változásának esemény kezelése saját eseménykezelők használatával (pl. ha a kollekcióban egy elem állapota megváltozik, akkor egy eseménykezelőben kezelni lehessen a bekövetkezett változásokat).
A Flyweight minta megvalósítása örökléssel a TCollection és TCollectionItem osztályokból (ez csak egy kód csontváz, amit igazából az adott célnak megfelelően kell elkészíteni, kiegészíteni a feladathoz leginkább illeszkedő mezőkkel, metódusokkal) Kollekció elem csontváz osztály interface része:
interface
uses
Classes, ...;
type
TMyCustomDataItem = class(TCollectionItem)
private
// itt kell definiálni azokat a mezők tároló változóit,
// amit majd a külvilág felé publikálni szeretnénk tulajdonságokon
// keresztül
FMyIntField : Integer;
FMyStringField : String;
...
public
constructor Create(Collection: TCollection); override;
...
property MyIntField : Integer read FMyIntField write FMyIntField;
property MyStringField : String read FMyStringField write FMyStringField;
...
end;
A kollekció elem publikált mezőihez lehet getter/setter metódusokat definiálni, ezt a konkrét feladat dönti el, hogy mire van szükségünk. Ha például eseményt szeretnénk kiváltani, ha egy elemnek (TCollectionItem) megváltozik a belső állapota, akkor a figyelni kívánt tulajdonság setter metódusát kell "felokosítani" erre a feladatra, hogy az állapot változásról értesítse ki a kollekciót kezelő objektumot (TCollection).
Kollekció csontváz osztály interface része:
...
TMyCustomDataCollection = class(TCollection)
private
function GetMyCustomDataItem(Index : Integer) : TMyCustomDataItem;
procedure SetMyCustomDataItem(Index : Integer;
const Value : TMyCustomDataItem);
public
destructor Destroy; override;
function Add : TMyCustomDataItem; overload;
function Add(AMyInt : Integer; AMyString : String) : TMyCustomDataItem; overload;
procedure DeleteAll;
procedure OrderByMyIntField;
property Items[Index : Integer] : TMyCustomDataItem read GetMyCustomDataItem
write SetMyCustomDataItem;
end;
A fenti példában a TMyCustomDataCollection osztályt felruházom rendezés funkcióval, ami a MyIntField mező szerint fogja a kollekcióban az elemeket sorba rendezni, az összes elem törlése funkció, egyedi adatokkal történő a adat inicializálás Add(1, 'MyString').
TMyCustomDataItem osztály implementációs csontváza:
...
implementation
{ TMyCustomDataItem }
constructor TMyCustomDataItem.Create(Collection: TCollection);
begin
inherited Create(Collection);
FMyIntField := $F0F0;
FMyStringField := '';
..
// további inicializáló utasítások
end;
TMyCustomDataCollection kollekció implementációs csontváza:
{ TMyCustomDataCollection }
destructor TMyCustomDataCollection.Destroy;
begin
DeleteAll;
inherited Destroy;
end;
function TMyCustomDataCollection.Add: TMyCustomDataItem;
begin
Result := inherited Add as TMyCustomDataItem;
end;
function TMyCustomDataCollection.Add(AMyInt : Integer; AMyString : String): TMyCustomDataItem;
begin
Result := inherited Add as TMyCustomDataItem;
Result.MyIntField := AMyInt;
Result.MyStringField := AMyString;
..
// további értékadó utasítások
end;
procedure TMyCustomDataCollection.DeleteAll;
begin
while (Self.Count > 0) do
Self.Delete(0);
end;
function TMyCustomDataCollection.GetMyCustomDataItem(Index: Integer): TMyCustomDataItem;
begin
Result := inherited Items[Index] as TMyCustomDataItem;
end;
procedure TMyCustomDataCollection.SetMyCustomDataItem(Index: Integer;
const Value: TMyCustomDataItem);
begin
inherited Items[Index] := Value;
end;
procedure TMyCustomDataCollection.OrderBySessionNum;
var
iIndex : Integer;
iIndex2 : Integer;
pMinItem : TMyCustomDataItem;
pCurrItem : TMyCustomDataItem;
begin
// elemek rendezése FMyInt szám szerint növekvő sorrendben
// a min sort algoritmusnál van gyorsabb rendezés is ;)
for iIndex := 0 to Self.Count - 1 do
begin
pMinItem := Self.Items[iIndex];
for iIndex2 := iIndex to Self.Count - 1 do
begin
pCurrItem := Self.Items[iIndex2];
if pCurrItem.SessionNum < pMinItem.SessionNum then
begin
pCurrItem.Index := pMinItem.Index;
pMinItem := pCurrItem;
end;
end;
end;
end;
A fenti csontvázak alapján a saját igényeknek megfelelően kell tovább bővíteni a kollekció és kollekció elem osztályokat.
Nincsenek megjegyzések:
Megjegyzés küldése