mclang Ответов: 1

Подходит ли мне шаблон дизайна декоратора?


У меня есть сокет-сервер Mono/C#, который принимает несколько различных типов клиентов.

Когда клиент подключается и отправляет данные, фабрика клиентов используется для создания нового клиента нужного типа. Базовый тип определяется по данным, которые отправляет клиент. Это самая простая часть - у меня есть интерфейс IClient, который наследует каждый класс BaseClient, и данные обрабатываются в функции клиентов базового типа HandleData.

Проблема в том, что некоторые из этих базовых клиентов имеют несколько подтипов, которые должны обрабатывать входящие данные иначе, чем базовый клиентский класс. Кроме того, у некоторых клиентов могут быть включены дополнительные функции (или несколько!), которые изменяют то, какие данные ожидаются и как они должны обрабатываться.

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

Что я уже пробовал:

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

Может быть, это делает вещи яснее:
1. клиент подключается к серверу сокетов и отправляет данные
2. ClientFactory создает правильный базовый клиент в соответствии с данными
3. Сокет сервера звонки клиентов HandleData'
4. Клиент (HandleData) определяет подтип и ClientDataHandler создает '' соответственно
5. клиент (HandleData) вызывает ClientDataHandler.HandleData'

Все это дело представляет собой беспорядок главным образом потому, что несколько базовых типов клиентов могут иметь схожие функциональные возможности (например, parse GPRMC). Точно так же многие подтипы клиентов могут иметь одно и то же активированное расширение, что привело к большому количеству дубликатов кода между различными реализациями ClientDataHandler :(

1 Ответов

Рейтинг:
12

cjmakwana

Когда мы говорим, что клиент отправляет данные в 1 выше, каков формат данных ? Если это сериализованный поток байтов, то как сервер определит, на каком именно конкретном типе он должен инициализироваться для соответствующего потока данных ? Это на самом деле делает вещи более сложными.

Если возможно, давайте иметь общую часть заголовка в самих данных, которая описывает тип клиента. Затем внутри метода HandleData () мы должны передать этот тип клиента, который инициализирует конкретный тип клиента, и передать оставшиеся данные для инициализации объекта. Здесь вы можете использовать шаблон пула объектов ( <a href="https://en.wikipedia.org/wiki/Object_pool_pattern") а[^] для большей эффективности. Или даже прототип шаблона ( <a href="https://en.wikipedia.org/wiki/Prototype_pattern") а[^] могут работать.


mclang

Извините, я был в командировке и забыл проверить это.

Большая часть данных-это базовый ASCII, но я думаю, что один клиент отправляет двоичный файл. Мы не можем контролировать формат данных, поэтому выбор правильного клиентского класса для создания будет беспорядком :(

Текущая логика делает это, я имею в виду создание конкретных типов после того, как тип клиента обнаружен. Это делается с помощью класса Factory/Builder. Проблема заключается в том, что каждый тип клиента может иметь дополнения, такие как различная информация ввода-вывода, которая также должна быть обработана. Если я сделаю обработку данных этих дополнений в конкретных типах клиентов, это приведет к большому дублированию кода.

Я проверю эти две модели.