Перейти к содержанию
Fire Monkey от А до Я
  • 0

Паттерн Observer не работает из коробки.


Ufomaster

Вопрос

Не работает автоматически с генерированный паттерн наблюдатель, приходится его изменять. Это баг или  его нужно как-то по другому инициировать? Можно ли как то поменять шаблон автогенерации? 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
17 минут назад, Pax Beach сказал:

Расскажите, какие цели планируете достигнуть при помощи обсервера?

Изучаю паттерны.  Меня интересует почему рабочий паттерн отличается от того который среда генерирует по умолчанию. 

Ссылка на комментарий
  • 0
1 час назад, Ufomaster сказал:

Изучаю паттерны.  Меня интересует почему рабочий паттерн отличается от того который среда генерирует по умолчанию. 

Я бы не пользовался данной функцией генерации паттернов, судя по тому что TList здесь создается не дженериковый, а обычный, функционал этот довольно заброшен.

А уж отсутствию(!) у TSubject удаления созданного им TList это еще и говнокод.

  IObserver = interface
    procedure Update(ASubject: TSubject);
  end;

  TSubject = class
  strict private
    FObservers: TList;
  public
    constructor Create;
    procedure Attach(AObserver: IObserver);
    procedure Detach(AObserver: IObserver);
  strict protected
    procedure NotifyObservers;
  end;

  TConcreteSubject = class(TSubject)
  end;

  TConcreteObserver = class(TInterfacedObject, IObserver)
  public
    procedure Update(ASubject: TSubject);
  end;

constructor TSubject.Create;
begin
  inherited Create;
  FObservers := TList.Create;
end;

procedure TSubject.Attach(AObserver: IObserver);
begin
  FObservers.Add(@AObserver);
end;

procedure TSubject.Detach(AObserver: IObserver);
var
  idx: Integer;
begin
  idx := FObservers.IndexOf(@AObserver);
  If idx <> -1 Then
  begin
    FObservers.Delete(idx);
  end;
end;

procedure TSubject.NotifyObservers;
var
  Current: ^IObserver;
begin
  for Current in FObservers do
  begin
    Current.Update(self);
  end;
end;

procedure TConcreteObserver.Update(ASubject: TSubject);
begin
  // put your code here
end;

 

Изменено пользователем Error
добавил сгенерированный код
Ссылка на комментарий
  • 0
1 час назад, Error сказал:

Я бы не пользовался данной функцией генерации паттернов, судя по тому что TList здесь создается не дженериковый, а обычный, функционал этот довольно заброшен.

А уж отсутствию(!) у TSubject удаления созданного им TList это еще и говнокод.

а как этот или можно еще лучше https://github.com/jimmckeeth/DelphiPatterns/blob/master/Behavioral.Observer/Pattern.pas

Изменено пользователем Andrey Efimov
Убрал излишнее цитирование
Ссылка на комментарий
  • 0
3 минуты назад, Ufomaster сказал:

На мой взгляд - там все хорошо, и нет утечки памяти :)

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...