архитектура приложения с поддержкой plug-in
Основные требования: сделать программу максимально гибкой, расширяемой во многих направлениях и как можно более платформенно-независимой (на тот случай если будет решено перейти на другую платформу). Интересуют мнения по поводу следующего...
Например, есть иерархия интерфейсов визуальных объектов, определяемая как в ядре, так и в плагинах, т.е. модуль может "вклиниться" в любое место иерархии.
Требуется, чтобы любой плагин мог создавать любой визуальный объект из этой иерархии.
Примерно так я решил это реализовать:
Модуль предоставляет следующее: интерфейс (IPlot_pluggable, IObserver_pluggable), идентификатор интерфейса (GUID) и фабрику для создания экземпляров (IView_factory), которые добавляются в хранилище ядра. Ядро по GUID находит нужную фабрику и создает экземпляр.
Теперь как делать реализацию интерфейса в модуле...
Поступил я следующим образом:
для каждого интерфейса из иерархии дополнительно поставляется обертка для него в виде шаблона, единственным параметром которого является суперкласс.
В конструкторе эта обертка по известному ей GUID создает экземпляр для своего же интерфейса (IPlot) и делигирует все запросы IPlot этому экземпляру, а оставшаяся часть интерфейса реализуется в Plot_pluggable. Конечно же можно было применить и множественное наследование но, имхо, лучше воспользоваться шаблоном.
Недостатком здесь конечно является то что приходиться делать двойную работу создавая обертку и необходимо в конструкторе иметь доступ к ядру чтобы получить доступ к фабрике, что не очень то радует...
какие есть более элегантные решения?
тут (pdf), это #develop IDE.
По архитектуре аддонов/плагинов неплохо рассказано