Ну, я думал о дизайнерском решении в течение последних нескольких дней, и так как я все еще не могу отдать предпочтение одному над другим, я подумал, что, возможно, у кого-то есть идея.
Ситуация следующая: у меня есть пара различных классов интерфейса, абстрагирующих несколько устройств связи. Поскольку эти устройства различаются по своей природе, они также различаются по интерфейсу и, таким образом, на самом деле не связаны между собой. Давайте назовем их IFooDevice и IBarDevice . Со временем может быть добавлено больше типов устройств. Язык C ++.
Поскольку другие компоненты (с этого момента называемые клиентами) могут использовать одно или несколько из этих устройств, я решил предоставить класс DeviceManager для обработки доступа ко всем доступным устройствам во время выполнения. Поскольку число типов устройств может увеличиться, я хотел бы относиться ко всем устройствам одинаково (с точки зрения менеджеров). Однако клиенты будут запрашивать определенный тип устройства (или устройства на основе некоторых свойств).
Я подумал о двух возможных решениях:
Первым будет какая-то иерархия переходов. Все устройства будут иметь подкласс общего интерфейса IDevice , который обеспечит (виртуальные) методы, необходимые для управления и запроса устройства (например, getProperties () , hasProperties () , ...). DeviceManager затем имеет набор указателей на IDevice , и в какой-то момент будет необходимо приведение от Base до Derived - либо с шаблонный метод в менеджере или после запроса на стороне клиента.
С точки зрения дизайна, я думаю, было бы более элегантно разделить проблемы управления устройством и интерфейсом конкретного устройства. Таким образом, это привело бы к двум несвязанным интерфейсам: IManagedDevice и, например, IFooDevice . Реальное устройство должно быть унаследовано от обоих, чтобы «быть» конкретным типом устройства и быть управляемым. Менеджер будет управлять только указателями на IManagedDevice . Однако в какой-то момент возникнет необходимость в приведении между теперь не связанными классами (например, от IManagedDevice до IFooDevice ), если клиент захочет использовать устройство, предоставленное менеджером.
Должен ли я выбрать меньшее из двух зол здесь? И если так, какой это будет? Или я что-то пропустил?
Edit:
Об "управляющей" части. Идея состоит в том, чтобы иметь библиотеку, предоставляющую различные устройства связи, которые различные (клиентские) приложения могут использовать и совместно использовать. Управление просто сводится к хранению экземпляров, методам регистрации нового устройства и поиска определенного устройства. Ответственность за выбор «правильного» устройства для задачи лежит на стороне клиента, поскольку он лучше знает, какие требования он предъявляет к связи. Чтобы повторно использовать и, таким образом, делиться доступными устройствами (и под этим я подразумеваю реальные экземпляры, а не только классы), мне нужна центральная точка доступа ко всем доступным устройствам. Мне не очень нравится сам менеджер, но это единственное, что я мог придумать в этом случае.