Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Создание системы шины сообщений в Delphi: паттерн наблюдателя без приведения типов

Delphi , Компоненты и Классы , Свойства и События

Вопрос пользователя касается создания системы шины сообщений (message bus) в Delphi, которая позволила бы писать издателей (publishers) и подписчиков (subscribers) с использованием паттерна наблюдателя. Цель состоит в том, чтобы избежать приведения типов в обработчике сообщений, позволяя использовать обобщенный обработчик THandler<T: TMessage>.

Проблема

Пользователь хочет создать систему сообщений, где издатели и подписчики могут обмениваться сообщениями разных типов, не прибегая к приведению типов в обработчиках. Пример кода показывает, как должен работать издатель и подписчик, но не решает вопрос обобщения обработчика сообщений.

Решение

Для решения этой задачи можно использовать RTTI (Runtime Type Information) вместе с обобщенными классами. Создадим обобщенный класс TPublisher<T>, который будет управлять подписчиками для конкретного типа сообщений T.

unit UPublisher;

interface

uses
  System.SysUtils,
  System.Rtti;

type
  TPublisher<T> = class
  private
    type
      THandler = procedure(const Sender: TObject; const AMessage: T);
    FHandlers: TArray<THandler>;
  protected
    procedure SendMessages(const ASender: TObject; const AMessage: TRttiType);
  public
    class constructor Create;
    class procedure Subscribe(const AHandler: THandler);
    class procedure SendMessage(const ASender: TObject; const AMessage: T);
  end;

type
  TMessageBus = class
  private
    FPublishers: TArray<TPublisher<RttiType>>;
  public
    procedure RegisterPublisher(const APublisher: TPublisher<RttiType>);
    class procedure SendMessage(const ASender: TObject; const AMessage: TRttiInstance);
    constructor Create;
  end;

var
  MessageBus: TMessageBus;

implementation

// Остальная часть реализации класса TPublisher и TMessageBus
// ...

end.

В примере выше TRttiType и TRttiInstance используются для работы с типами и объектами соответственно, что позволяет избежать приведения типов.

Пример использования

type
  TStuffHasHappenedMessage = class(TMessage)
  public
    Text: string;
    constructor Create(const AText: string);
  end;

constructor TStuffHasHappenedMessage.Create(const AText: string);
begin
  Text := AText;
end;

type
  THandler<T> = procedure(const Sender: TObject; const AMessage: T);

procedure MyHandler(const Sender: TObject; const AMessage: TStuffHasHappenedMessage);
begin
  ShowMessage(AMessage.Text);
end;

procedure TForm1.ButtonClick(Sender: TObject);
begin
  TPublisher<TStuffHasHappenedMessage>.Subscribe(MyHandler);
  MessageBus.SendMessage(Self, TStuffHasHappenedMessage.Create('Some Text'));
end;

Заключение

Создание системы шины сообщений в Delphi с использованием обобщений и RTTI позволяет избежать приведения типов в обработчиках сообщений. Это упрощает разработку и повышает читаемость кода, делая его более универсальным и масштабируемым.

Важные замечания

При использовании RTTI и обобщений важно учитывать производительность, так как дополнительные операции могут увеличивать нагрузку на приложение. Также следует тщательно тестировать систему, чтобы избежать возможных ошибок при работе с разными типами сообщений.

Создано по материалам из источника по ссылке.

Вопрос касается создания системы шины сообщений в среде разработки Delphi, используя паттерн наблюдатель и обобщения для обработки сообщений различного типа без приведения типов.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Свойства и События ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 09:49:59/0.0034658908843994/0