Einzelnen Beitrag anzeigen

Devstructor

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

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