什么是插件
插件,想必大家应该是陌生了吧,什么Vim、VS code、JetBrains全家桶啊都支持插件,但是这背后是如何实现的呢?今天我们就来好好掰扯掰扯。首先我们可以先来看看对插件比较官方的定义,还麻烦大家挪挪步百度百科关于插件的定义,但是这些都不重要,重要的是我们要如何来实现插件机制,如何实现在对已有程序不做任何修改的情况下,对程序功能的扩展。。。
需求
大家先把菜刀准备好啊,需求要来了,贴个代码先:
1 | int main(int argc, char *argv[]) |
没错,这就是一个简单的Hello world,但是呢,
- 产品汪A: 我这个项目要先打印一行
123456再显示Hello world - 产品汪B: 我这个项目要先先打印
Hello world再打印123456 - 产品汪C: 我这个不显示
Hello world,只打印123456 - 产品汪…….
这个栗子比较简单,一般我们遇到的需求比这个复杂多了,动不动就是某某功能里面,我要加一个什么什么逻辑,所以针对不同的需求,就要编译N个版本的exe进行交付,然后又要挨着全部测试N遍吗?不,插件机制,就能很好的帮我们解决这个问题。
引入插件后的程序结构

整个插件框架大概是这个样子的,最主要的编码工作是在PluginManager这个类里面,其他两个都是约定的接口,但是针对我们上面的需求,就是下面这个样子的:

其中IPrintEvent是定义的一个打印事件,而PrintPlugin则是具体的打印实现过程,即直接将PrintPlugin的打印实现直接变成so,然后由程序启动后进行动态加载即可。
废话就不多说了,是骡子是马,咱拉出来溜溜,首先贴个图,便于直观的理解。