Зависит от того, как вы собираетесь управлять, а также с точки зрения производительности на этом.Но вы можете сделать что-то вроде этого. Псевдокод :
public class Host {
HostEventDispatcher dispatcher = new HostEventDispatcher ();
MenuTypes {File, Tools, Options, Help}
ToolBarTypes {MainBar}
AddSubMenuToMainMenu(IMenu menu, MenuTypes hostMenu);
AddSubMenuToMainMenu(IToolbar toolbar, ToolBarTypes hostToolbar);
public void LoadPlugin(IPlugin plugin)
{
plugin.Dispatcher = dispatcher;
}
}
interface IMenu {/* control warpper implementation */}
interface IToolBar {/* control wrapper implementation */}
public HostEventDispatcher {
//raises events to subscribers (Host, plugins)
/***** event list ***/
}
public interface IPlugin
{
Dispatcher {get;set} //using this plugin can raise/recieve evets to/from Host.
}
Очень простая идея.Но это наверняка станет более сложным в реальной реализации и может легко усложниться после.Обратите внимание на сложность, так как она влияет на производительность, потому что ее легко пропустить по шаблону «максимальной гибкости».
С уважением.