10. april 2001 - 16:36Der er
11 kommentarer og 2 løsninger
Observer pattern
Jeg skal bruge en observer, der kan modtage et object, der så bliver lagt i en doubelt linked liste, sådan at man kan spørge på First, Last, Next, Previos, Type (2 stk. A/B), Antal_A, Antal_B, Antal.
Det må gerne overholde GOF beskrivelsen af et observer pattern, men der er noget med at det kræver lidt fusk, og det er det fusk jeg ikke lige kan huske at lave.
Hvad er et Observer / Observer pattern? Har det nogen relevans til spørgsmålet, som tilsyneladende mest drejer sig om hvorledes man opbygger en dobbelt linked liste af poster, der hver indeholder et object (en pointer) samt nogle interger værdier.
Type TObserverList = Class Private FFirst : TObserverObject; FLast : TObserverObject; FCurrent : TObserverObject; FObsAntal : TObsAntal;
Function GetPrev : TObserverObject; Function GetNext : TObserverObject; Function GetCurObsType : TObsType; function GetAntal: Integer; function GetObsAntal(Index: TObsType): Integer; Public Procedure Append(ObsObj : TObserverObject);
procedure TObserverList.Append(ObsObj: TObserverObject); begin If FFirst = Nil Then Begin FFirst := ObsObj; FLast := ObsObj; FCurrent := ObsObj; End Else Begin Last.Next := ObsObj; FLast := ObsObj; End;
Inc(FObsAntal[ObsObj.ObsType]); end;
function TObserverList.GetAntal: Integer; Var Index : TObsType; begin Result := 0; For Index := Low(TObsType) to High(TObsType) Do Result := Result + ObsAntal[Index]; end;
function TObserverList.GetCurObsType: TObsType; begin If FCurrent=Nil Then Raise Exception.Create(\'Error: Current object is undefined.\');
Result := FCurrent.ObsType; end;
function TObserverList.GetPrev: TObserverObject; begin If FCurrent=Nil Then Raise Exception.Create(\'Error: Current object is undefined.\');
FCurrent := FCurrent.Prev; Result := FCurrent; end;
function TObserverList.GetNext: TObserverObject; begin If FCurrent=Nil Then Raise Exception.Create(\'Error: Current object is undefined.\');
FCurrent := FCurrent.Next; Result := FCurrent; end;
function TObserverList.GetObsAntal(Index: TObsType): Integer; begin Result := FObsAntal[Index]; end;
Når man læser/kalder Listens First og Last properties, så får man ganske rigtigt det første/sidste element i listen. Men! - dette flytter ikke current object pointeren. Hvis dette er ønsket/nødvendigt, så må du lige lave to getter metoder for First/Last, hvor du dels returner FFirst og FLast værdierne, samt sættrer FCurrent til enten FFirst/FLast.
Når man læser/kalder Listens First og Last properties, så får man ganske rigtigt det første/sidste element i listen. Men! - dette flytter ikke current object pointeren. Hvis dette er ønsket/nødvendigt, så må du lige lave to getter metoder for First/Last, hvor du dels returner FFirst og FLast værdierne, samt sættrer FCurrent til enten FFirst/FLast.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.