AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Observer-Pattern Implementation
Thema durchsuchen
Ansicht
Themen-Optionen

Observer-Pattern Implementation

Ein Thema von Ghostwalker · begonnen am 10. Nov 2016 · letzter Beitrag vom 11. Nov 2016
 
Devstructor

Registriert seit: 7. Sep 2016
4 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Observer-Pattern Implementation

  Alt 11. Nov 2016, 07:11
Hi,

ich hatte mal für ein privates Projekt Observer-Komponenten geschrieben. Du kannst da mal rüber schauen
Mit einer List hatte ich nicht gearbeitet, sondern mit einer TInterfacedList, das wäre sicher eine Optimierung
Der TMBObserver ist eigentlich nur eine Basiskomponente, man könnte auch einfach das Interface IMBObserver zum Beispiel einem Form hinzufügen.

Delphi-Quellcode:
unit MBSubject;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, MBObserver;

type
  IMBSubject = interface
    ['{A89B6DD9-711C-4444-BF29-1AB0335A489C}']
    procedure AddObserver(Observer: IMBObserver);
    procedure RemoveObserver(Observer: IMBObserver);
    procedure ClearObservers;
    procedure NotifiyObservers;
  end;

  { TMBSubject }

  TMBSubject = class(TComponent, IMBSubject)
  private
    FEnabled: Boolean;
    FObservers: TInterfaceList;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    procedure AddObserver(Observer: IMBObserver);
    procedure RemoveObserver(Observer: IMBObserver);
    procedure ClearObservers;

    procedure NotifiyObservers;
  published
    property Enabled: Boolean read FEnabled write FEnabled default True;
  end;

procedure Register;

implementation

procedure Register;
begin
  {$I mbsubject_icon.lrs}
  RegisterComponents('MBComponents',[TMBSubject]);
end;

{ TMBSubject }

constructor TMBSubject.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  FObservers:=TInterfaceList.Create;
  FEnabled:=True;
end;

destructor TMBSubject.Destroy;
begin
  if Assigned(FObservers) then FreeAndNil(FObservers);

  inherited Destroy;
end;

procedure TMBSubject.AddObserver(Observer: IMBObserver);
begin
  if FObservers.IndexOf(Observer) = -1 then FObservers.Add(Observer);
end;

procedure TMBSubject.RemoveObserver(Observer: IMBObserver);
begin
  FObservers.Remove(Observer);
end;

procedure TMBSubject.ClearObservers;
begin
  FObservers.Clear;
end;

procedure TMBSubject.NotifiyObservers;
var
  i: Integer;
  Observer: IMBObserver;
begin
  if not FEnabled then Exit;

  for i := 0 to Pred(FObservers.Count) do
    if Supports(FObservers.Items[i], IMBObserver, Observer) then Observer.SubjectChanged(Self);
end;

end.
Delphi-Quellcode:
unit MBObserver;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources;

type
  IMBObserver = interface
    ['{512FD47A-6122-4EFF-9ED4-09AC795EF794}']
    procedure SubjectChanged(Sender: TObject);
  end;

  { TMBObserver }

  TMBObserver = class(TComponent, IMBObserver)
  private
    FOnSubjectChanged: TNotifyEvent;
  protected
    procedure SubjectChanged(Sender: TObject);
  published
    property OnSubjectChanged: TNotifyEvent read FOnSubjectChanged write FOnSubjectChanged;
  end;

procedure Register;

implementation

procedure Register;
begin
  {$I mbobserver_icon.lrs}
  RegisterComponents('MBComponents',[TMBObserver]);
end;

{ TMBObserver }

procedure TMBObserver.SubjectChanged(Sender: TObject);
begin
  if Assigned(FOnSubjectChanged) then FOnSubjectChanged(Sender);
end;

end.
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:52 Uhr.
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