В предыдущей заметке были исправлены ошибки эталонной реализации паттерна проектирования Typed Message. Далее речь пойдет о способе применения паттерна на тривиальном примере на C++.
Как упоминалось ранее, с помощью Typed Message можно определять сущности широковещательных сообщений. Подходящая аналогия для таких сущностей - радиоволны в идеальном радиоэфире.

Постановка задачи

Пусть дан экземпляр класса Sender:

struct Sender {} sender;

Также существует класс Receiver, объектам которого необходимо передать сообщение содержащее данные экземпляра класса Sender, при условии, что интерфейс класса Sender недоступен классу Receiver, обратное также верно (т.е. экземпляры классов Sender и Receiver находятся вне зоны прямой видимости друг от друга).

Ход решения

  1. Объявить класс сообщения.

    struct Message: public TypedMessage<Message>
    {
    int m_value;
    Message( int value ): m_value( value ) {}
    };
  2. Добавить фукцию-член класса Sender, которая посылает сообщение (экземпляр класса Message).

    struct Sender
    {
    void setState( int value )
    {
    Message( value ).notify();
    }
    } sender;
  3. Включить в иерархию предков класса Receiver класс Message::Listener

    class Receiver: private Message::Listener
    {
    };
  4. Перекрыть в классе Receiver чистую витруальную функцию-член родительского класса Message::Listener.

    class Receiver: private Message::Listener
    {
    int acceptMessage( const Message &message )
    {
    // do something with message.m_value
    }
    };

Таким образом, данные класса Sender передаються при вызове фукнции-члена Sender::setState() всем конкретным наследникам интерфейса Message::Listener.

На практике широковещательных сообщений десятки, или даже сотни. Поэтому для использования Typed Message необходим компилятор, который позволяет множественное наследование классов, хотя бы на уровне чисто абстрактных классов. Если применение множественного наследования для класса невозможно (например для VCL форм в bcc 5.5), необходимо заменить его на закрытое делегирование.

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru
* * * * * 1 голосов

Один комментарий на “Пример использования паттерна Typed Message”

  1. seagull сказал:

    Спасибо, Дима, за то что ответил на мой вопрос о применении.

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





Оставте свое мнение