![]() |
1
2
您的设计决策的关键是分析并清楚地了解插件与其他插件的区别。 例如,在处理静态事件时,您可能必须将每个事件定义为某种形式的令牌、枚举、对象等。必须为每个插件定义一组新的事件,这自然会对您的整个设计产生不利影响,特别是在松散耦合和重用方面。 如果您的插件非常不同,您可能会受益于具有总线/消息传递体系结构,因为在这种情况下,您可以引入通信交换的域/类别,插件可以订阅这些域/类别。也就是说,一系列事件和消息可以在某个感兴趣的域中。请注意,在某个类别中的通信仍然可以使用静态事件,因此这两个备选方案并不相互排斥。 根据我的经验,插件实现的直接接口是插件体系结构中最严格的方法。扩展插件接口通常意味着同时修改插件和提供程序的代码。您需要有一个可靠的通用接口,您知道您的应用程序可以在这个接口上生存一段时间。 通过将设计分为两个方面,您可能更容易处理它- 通信信道 和 协议 . 静态事件处理是一个协议问题,而总线消息和直接接口是一个通道问题。 通常我会说,从一开始就很难正确地设计协议,因为您可能对您可以画线的一般性或具体性没有明确的感觉。 编辑: Lars在他的评论中提出了一个重要的观点——如果你的平台支持异常,你可以在使用直接接口时集中大量的错误处理,从而使插件不必处理一般性的错误,可能会超出它们的特定域(例如“插件加载错误”或“文件打开失败”)。但是,如果每次添加插件时都必须维护接口,那么这样的好处似乎就会消失。最糟糕的情况是,当界面开始变得不一致时,因为您没有意识到它们从一开始就应该支持什么。当已经构思了大量插件时,重构整个接口设计不是一件容易的任务。 |
![]() |
2
0
我愿意和你一起去 观察员 模式。来自GOF:
也被称为publish subscribe,我建议它与您示例中的情况2最接近。 |
![]() |
A B · C#Excel自动调整列避免长文本时出错 3 月前 |
![]() |
pseudodev · 失败的测试仅显示堆栈跟踪,不显示完整日志 4 月前 |
![]() |
CactusCake · if语句中应有分号 5 月前 |
![]() |
Bin4ry · 子文件夹中的应用程序设置 5 月前 |