Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Observer-Pattern Implementation (https://www.delphipraxis.net/190820-observer-pattern-implementation.html)

Devstructor 11. Nov 2016 09:33

AW: Observer-Pattern Implementation
 
Bitte :)

Das ist aber gar nicht nötig, sondern eher unschön. Die TInterfacedList wird dir nicht einfach zerstört. Dafür ist es wichtig zu wissen, wann Interfaces mit Referenzenzähler zerstört werden.

Als erstes muss der Referenzzähler aktiv sein. Bei einem TComponent wurde das zum Beispiel deaktiviert, doch die TInterfacedList ist abgeleitet von TInterfacedObject und dort werden die Referenzen gezählt. Es scheint also, als wäre die TInterfacedList gefährlich, dem ist aber nicht so.

Das Objekt wird zerstört, wenn die Referenz inkrementiert wurde und danach wieder den RefCount 0 erreicht. Wenn du den RefCount nicht erhöhst, wird auch nichts zerstört.
Um jetzt das TMBSubject zu zerstören, müsste man sich blöd anstellen. Man müsste nämlich auf die TInterfaceList mit einer Interface-Referenz zugreifen. Sprich man müsste die Liste über IInterfaceList steuern. Das ist einerseits daneben, denn man hat ja die Liste als Objekt, da muss man nicht noch eine Referenz eines Interfaces ansprechen, andererseits ist das auch nicht möglich, denn die InterfacedList ist im private Teil und alle Operationen auf dieser Liste werden in TMBSubject erledigt.

Folglich wird dir nicht einfach irgendwas zerstört und das Ganze ist sicher im Gebrauch, sonst hätte die TInterfacedList überhaupt keine Existenzberechtigung.

Wenn man die Liste zerstören möchte, müsste man in TMBSubject soetwas machen:
Delphi-Quellcode:
procedure TMBSubject.ClearObservers;
var
  MeineListeAlsInterfacec: IInterfaceList;
begin
  if Supports(FObservers,IInterfaceList,MeineListeAlsInterfacec) then
  begin
    MeineListeAlsInterfacec.Clear;
  end;
end;
Anstelle von diesem ,,normalen" Vorgehen
Delphi-Quellcode:
procedure TMBSubject.ClearObservers;
begin
  FObservers.Clear;
end;

Stevie 11. Nov 2016 11:09

AW: Observer-Pattern Implementation
 
Zitat:

Zitat von Phoenix (Beitrag 1353340)
Als kleiner Tipp: Es gibt sehr gute Implementierungen der ganzen Sache (also Obersever Pattern und Iterator Pattern) mit einem größtenteils sehr einheitlichen Interface: http://reactivex.io/

Leider ist hier (noch? ;-) ) keine Bibliothek für Delphi dabei.

Ich hab kürzlich angefangen, das in Spring4D zu implementieren, allerdings hat das noch internen Prototyp Status :)

Ghostwalker 11. Nov 2016 11:32

AW: Observer-Pattern Implementation
 
Also...runtergezogen hab ich mir mal die JS-Variante. Da ich die letzen Jahre Web-Programmierung gemacht habe (php,js,html,css usw..) war das die Sprache die mir noch am vertrautesten ist.

War aber auch erstmal etwas geschockt...6 MB JS-Source (gezipt !) is ne menge holz.

Habe aber doch den Core schonmal etwas überflogen und das ein oder andere Feature entdeckt :)
(Dummerweise hab ich dann den Examples-Ordner entdeckt...und Alphabetinvasion...:lol:)

Allerdings hab ich den Eindruck gewonnen, das man hier eine Eierlegende Wollmilchsau versucht zu
programmieren. Und aus Erfahrung kann ich sagen, das das über kurz oder lang schief läuft.

Als Ideen und Anregungs-Pool wirds erstmal bleiben, aber nach Delphi werd ich das garantiert nicht
portieren :)


(Okokok.....ich geb zu...es bleibt wegen Alphabetinvasion:-D)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:29 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz