Avatar billede seider Nybegynder
10. april 2001 - 16:36 Der 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.
Avatar billede delphi Nybegynder
11. april 2001 - 09:01 #1
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.

Peter
Avatar billede seider Nybegynder
11. april 2001 - 13:22 #2
Et observer pattern en en model til at sørge for at forskelige klienter blvier opdateret, den indeholder følgende funktioner.

Attach(object), detach(Object), update(), notify().

kendes også som Dependts eller Publisher-Subscriber
Avatar billede nico26 Nybegynder
11. april 2001 - 16:11 #3
Hvor ligger listen?
Avatar billede seider Nybegynder
17. april 2001 - 21:43 #4
i en unti for sig selv, den opretholder sig selv, med en first + last (hvis doublet linket).

/* Seider */
Avatar billede delphi Nybegynder
18. april 2001 - 09:07 #5
Kan du bruge det her?  Det er banket sammen på 20 minutter og slet ikke testet, men compileren æder det, så mon ikke at det funker.

{**********************************************************************}
{* Unit: ObsList                                                      *}
{* Author: Niels Peter Gibe, 2001-04-18                              *}
{*                                                                    *}
{* Description:                                                      *}
{* Defines TObserverList and related classes for some dude on the    *}
{* Eksperten site....                                                *}
{*                                                                    *}
{**********************************************************************}
{* Revision:                                                          *}
{*                                                                    *}
{**********************************************************************}
unit ObsList;
interface
Uses
  SysUtils; // Definition of Exception class.

Type
  TObsType  = (ObsA, ObsB);
  TObsAntal = Array[Low(TObsType)..High(TObsType)] Of Integer;

Type
  TObserverObject = Class
    Private
      FObsType : TObsType;
      FNext    : TObserverObject;
      FPrev    : TObserverObject;
    Published
      Constructor Create(aObsType : TObsType);
      Property ObsType : TObsType        read FObsType write FObsType;
      Property Prev    : TObserverObject read FPrev write FPrev;
      Property Next    : TObserverObject read FNext write FNext;
  End;

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);

      Property First      : TObserverObject read FFirst;
      Property Last      : TObserverObject read FLast;
      Property Prev      : TObserverObject read GetPrev;
      Property Next      : TObserverObject read GetNext;
      Property CurObsType : TObsType        read GetCurObsType;
      Property Antal      : Integer        read GetAntal;
      property ObsAntal[Index: TObsType] : Integer read GetObsAntal;
  End;

implementation

{ TObserverObject }

constructor TObserverObject.Create(aObsType : TObsType);
begin
  FPrev    := Nil;
  FNext    := Nil;
  FObsType := aObsType;
end;

{ TObserverList }

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;


end.
Avatar billede delphi Nybegynder
18. april 2001 - 09:11 #6
Sidder lige og ser en ting.

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.

Peter
Avatar billede delphi Nybegynder
18. april 2001 - 09:11 #7
Sidder lige og ser en ting.

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.

Peter
Avatar billede delphi Nybegynder
18. april 2001 - 09:12 #8
Ups...dobbelt click... Sikke en begynder fejl...
Avatar billede seider Nybegynder
25. april 2001 - 03:05 #9
skal lige evaluere det
Avatar billede delphi Nybegynder
03. maj 2001 - 11:50 #10
Har du så fået evalueret det?
Peter
Avatar billede seider Nybegynder
09. maj 2001 - 12:10 #11
jeg skal lige bruge 3 min mere på at evaluere, 5 min var ikke nok
Avatar billede seider Nybegynder
27. juni 2001 - 07:44 #12
har ikke tjeketom det virker du får points for indsatsen....
Avatar billede delphi Nybegynder
27. juni 2001 - 08:59 #13
Det gør det (virker altså...)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester