Справка по дизайну - шаблон проектирования для обработки универсального интерфейса c для различных типов сообщений - PullRequest
0 голосов
/ 31 января 2020

Мне нужно вызвать интерфейс для узла, который может принимать сообщения с одинаковым заголовком, но с разными типами сообщений. Тип сообщения всегда находится в фиксированной позиции в заголовке. Эти типы сообщений могут быть далее разделены на две классификации - Atype (набор из 6 сообщений) и Btype (набор из 8 сообщений). Конструкция должна обеспечивать поддержку для простого добавления нового типа сообщения (например, Ctype) в интерфейс. Я думал о написании интерфейсного класса, который имеет std :: map с типом сообщения Atype или Btype, а message_handler_type является вызовом функции для соответствующих обработчиков сообщений (основанных на двух одноэлементных классах для AtypeMessage и BtypeMessage) - AtypeMessage :: get_instance () -> AtypeMessageHandler () или BtypeMessage :: get_instance () -> BtypeMessageHandler () и передают сообщение соответствующему обработчику сообщений на основе message_type. Этот узел получит огромное количество трафика c. Будет ли это достаточно хорошим дизайном для будущего расширения? Есть ли другие хорошие варианты дизайна, которые я пропускаю?

1 Ответ

0 голосов
/ 31 января 2020

Вы можете создать базовый класс для своих сообщений:

class Message {
public:
  virtual void do_something() = 0;
};

class MessageA : public Message {
public:
  void do_something() override {
    // ...
  } 
};

и наследовать все остальные сообщения от базового (как это делает MessageA в примере). Чем вы сможете использовать их как

void recieve_message(Message&) {
  // ... 
};

. Он также предоставляет полезный метод для расширения: вы можете просто добавить другой класс, производный от Message.

Извините, если я что-то неправильно понял: вопрос показался мне очень запутанным.

...