Перейти к содержанию
  • Регистрация
  • 0
Ufomaster

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

Вопрос

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

  • 0
1 час назад, Error сказал:

А как вы его генерируете ?

cs:=TConcreteSubject.Create;
co:= TConcreteObserver.Create;
cs.Attach(co);
cs.NotifyObservers;
cs.Free;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
4 часа назад, Ufomaster сказал:

cs:=TConcreteSubject.Create;
co:= TConcreteObserver.Create;
cs.Attach(co);
cs.NotifyObservers;
cs.Free;

 

Я имею ввиду как сам класс получили

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
38 минут назад, Error сказал:

Я имею ввиду как сам класс получили

На панели модел вьюв - грейт бай паттерн- обсервер

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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 сказал:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 минуту назад, Ufomaster сказал:

A подскажите примет MVC шаблона

https://habrahabr.ru/search/?q=delphi+mvc#h

Правда чистый MVC в VCL не выйдет\не целесообразен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

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


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

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

×
×
  • Создать...