Подходит ли мне шаблон дизайна декоратора?
У меня есть сокет-сервер Mono/C#, который принимает несколько различных типов клиентов.
Когда клиент подключается и отправляет данные, фабрика клиентов используется для создания нового клиента нужного типа. Базовый тип определяется по данным, которые отправляет клиент. Это самая простая часть - у меня есть интерфейс IClient, который наследует каждый класс BaseClient, и данные обрабатываются в функции клиентов базового типа HandleData.
Проблема в том, что некоторые из этих базовых клиентов имеют несколько подтипов, которые должны обрабатывать входящие данные иначе, чем базовый клиентский класс. Кроме того, у некоторых клиентов могут быть включены дополнительные функции (или несколько!), которые изменяют то, какие данные ожидаются и как они должны обрабатываться.
Поэтому мой вопрос таков: должен ли я изменить все это, чтобы использовать один базовый клиентский класс с шаблоном декоратора, обрабатывающим все различные виды обработки данных? Или какой-то другой шаблон лучше подходит для моей проблемы?
Что я уже пробовал:
В настоящее время те базовые клиентские классы, которые имеют несколько подтипов, имеют внутреннюю переменную под названием "ClientDataHandler", которая является классом, выполняющим реальную обработку данных. 'ClientDataHandler' имеет абстрактный тип 'ClientDataHandlerBase', который наследуется всеми различными клиентскими подклассами, выполняющими реальную обработку данных внутри базового клиентского класса.
Может быть, это делает вещи яснее:
1. клиент подключается к серверу сокетов и отправляет данные
2. ClientFactory создает правильный базовый клиент в соответствии с данными
3. Сокет сервера звонки клиентов HandleData'
4. Клиент (HandleData) определяет подтип и ClientDataHandler создает '' соответственно
5. клиент (HandleData) вызывает ClientDataHandler.HandleData'
Все это дело представляет собой беспорядок главным образом потому, что несколько базовых типов клиентов могут иметь схожие функциональные возможности (например, parse GPRMC). Точно так же многие подтипы клиентов могут иметь одно и то же активированное расширение, что привело к большому количеству дубликатов кода между различными реализациями ClientDataHandler :(