Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#14

AW: Objekt als Rückgabe von Funktion - Wie elegant Freigabe regeln?

  Alt 24. Aug 2013, 20:09
Wie wäre es mit einem Observer-Pattern? Das Objekt schickt dann bei Freigabe einfach eine entsprechende Nachricht an den Beobachter.

Skizze:
Delphi-Quellcode:
TTask = class;

ITaskObserver = interface
  procedure Observe(Task: TTask);

  procedure OnProgressChanged(Task: TTask; Progress: integer);
  procedure OnTaskDestroyed(Task: TTask);
end;

TTask = class{(TThread?)}
protected
  FObserver: ITaskObserver ;
  {...}
public
  {...}
  procedure Abort;
  constructor Create(Observer: ITaskObserver);
  destructor Destroy; override;
end;

TTaskFactory = class
  procedure CreateTask(Observer: ITaskObserver): TTask;
end;

implementation

constructor TTask.Create(Observer: ITaskObserver);
begin
  FObserver := Observer;
  FObserver.Observe(Self);
end;

destructor TTask.Destroy; override;
begin
  FObserver.OnTaskDestroyed(Self);
  inherited;
end;

procedure TTaskFactory.CreateTask(Observer: ITaskObserver): TTask;
begin
  Result := TTask.Create(Observer);
end;
Delphi-Quellcode:
TTaskController = class(TInterfacedObject, ITaskObserver)
protected
  FTasks: TList<TTask>;

  procedure Observe(Task: TTask);

  procedure OnProgressChanged(Task: TTask; Progress: integer);
  procedure OnTaskDestroyed(Task: TTask);
end;

procedure TTaskController.Observe(Task: TTask);
begin
  FTasks.Add(Task);
end;

procedure TTaskController.OnTaskDestroyed(Task: TTask);
begin
  FTasks.Remove(Task);
end;
In FTasks stehen dann eben jeweils die gültigen Tasks. Da könnte man z.B. dann TTask.Abort aufrufen.

Ist jetzt bewusst einfach gehalten, man könnte natürlich auch eine ganze Liste von Observern pro Objekt verwalten...

Geändert von Namenloser (24. Aug 2013 um 20:16 Uhr)
  Mit Zitat antworten Zitat