搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
我家自动化
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
数据结构单链表和双链表_数据结构单链接双链接是什么意思
2
Midjourney提示词-动物系列-1
3
maven导入Gson_maven gson
4
Golang | Leetcode Golang题解之第198题打家劫舍
5
Android发布依赖到 Jitpack_com.github.dcendents:android-maven-gradle-plugin
6
Java——jdk8新特性、Lambda表达式、Stream流_java jdk8字节流
7
MapReduce 模式、算法和用例
8
接口自动化和UI自动化的区别_ui自动化和接口自动化区别
9
jQuery-XSS漏洞(CVE-2020-11022/CVE-2020-11023)_cve-2020-11023复现
10
SpringSecurity:授权_spring security授权
当前位置:
article
> 正文
插件式应用程序的智慧_应用插件引擎是什么
作者:我家自动化 | 2024-07-21 13:53:10
赞
踩
应用插件引擎是什么
插件式应用程序的智慧
不知你经手过的应用程序项目会不会存在这样的情况:1.开发前说好功能分配到个人,可到头来别人写的却只是功能类库,你还是需要在主程序中调用它们;2.主程序存在大量的静态成员,同时对应的类库也或多或少的存在一些和主程序相关的静态成员;3.由于主程序功能太多,导致代码页中事件过多,代码冗长;4.客户偶尔要求添加或删除某个功能,你至少得找到主程序的源码,同时在界面中添加或删除某个功能,最后重新编译系统,实在太麻烦;5.同一个产品不同用户对于功能的要求不尽相同,你还得制作多个不同版本,即便是通过配置文件来实现功能的隐藏,但却也无法改变对象已被创建的事实。
你是否希望有一个这样的项目,可以将应用程序的各个功能的开发分配到个人,每个功能都对应一个类,开发完成后,他会自动集成到主界面中去;同时,主程序代码简约,整个应用程序没有或极少存在静态成员;添加一个新功能乃至几个大型的工具条,都无需再次打开旧的源码了重新编译;如果想注销界面里的指定的功能,只需要在配置文件中稍加记录,便可使整个系统在重新启动后,不在创建该对象的实例,实现真正的“瘦身”。
你是否会因为VS编译器在你安装过SVN后,主菜单上多了一个“VisualSVN”菜单项而感到好奇;你是否会因为ArcGIS Desktop支持用户自己开发,拓展系统功能而感到高级;你是否会因为Photoshop在加载界面时,会不断出现扫描系统文件(如:DLL文件)而感到帅气;你是否会因为ArcMap可以通过加载对话框,选择有效地文件(如:DLL文件)后,瞬间使界面上便出现一个或多个工具条而感到神奇。
其实,这些都是插件结构可以帮你解决和做到的。 要知道,所有大型的桌面应用程序基本使用的都是插件的结构,如:Office些列软件、ArcGIS Desktop系列软件、AutoCAD等等。下面我们来简单看一下插件结构。
一个插件应用程序主要五个部分组成:宿主对象、插件引擎、通信契约、各个插件对象、通信钩子。
宿主对象:顾名思义就是各个插件对象展现后所寄宿的实体对象,它就是用户看到的最终的界面部分,也就是我们常规开发里称的主程序。其实,一个插件应用程序的宿主对象不过只是一个简单地框架罢了,里面只需调用“插件引擎”并传入“通信钩子”就可以的,一共加起来不过百十行代码而已。(当然你也可以加入一些配置文件之类的东西,这些就另当别论。)这样的主程序就不会出现代码冗长的问题了。
插件引擎:就是将文件(即:编译后的系统文件,如:DLL文件)中的各个插件对象,通过反射机制将它们逐一读取,并依据“通信契约”将其分门别类的放入插件集合字典,再将它们转化成对应的实体对象,同时传入“通信钩子”,最终将其集成到宿主对象中去。插件引擎是整个插件系统的核心,它的实质就是如何将插件变成界面的操作对象。由此,只要有符合要求的编译文件,通过插件引擎就可以实现系统的无限拓展。当然,你也可以将不需要的插件对象,在系统读取插件时就将其屏蔽,实现真正的“瘦身”。
通信契约:是一个定义了不同插件对象接口和继承这些接口类的集合,用于标识和区分各个不同种类的插件对象,以及定义某种插件对象的基本信息。因此,我们只要继承对应的插件接口就可以不断添加新功能,而无需重新编译系统。
各个插件对象:是继承某一“通信契约”接口的插件对象,它是一个界面对象的具体实现者。这样我们便可以实现,一个界面对象对应一个类。同时,也可以正真的实现一个成员开发一个或多个功能,而无需再花时间将各功能集成到主界面中去(因为有插件引擎帮你自动处理)。当某一功能出现异常,我们便可直接到对应的类中去寻找原因,无需再在一堆混乱的源码中苦苦寻觅。
通信钩子:可以是一个或多个类或接口,它主要用于数据的通信,将宿主对象中要处理的数据或要操作的对象,关联到各个插件对象中去。有了这样的钩子作为整个系统通信的使者,你还需要定义如此之多的静态成员吗!
总的来看,一个插件式应用程序启动后,系统会检索和读取指定目录下存放的插件文件,通过反射机制查询里面所包含的插件对象,将符合条件的插件对象反射成实例,分门别类的放入插件集合字典中,再将它们转化成对应的实体对象同时传入“通信钩子”,最终集成到宿主对象中去。
由此看来,SVN只不过是在知道VS“通信契约”和“通信钩子”的前提下,对VS编译器进行了简单地拓展;ArcGIS Desktop支持用户自己开发拓展系统功能,只是因为它公布了桌面产品的“通信钩子”和“通信契约”;Photoshop在加载时,不断出现扫描系统文件,原来是在读取和解析插件文件; ArcMap软件通过加载效地文件(如:DLL文件)产生新的工具条,不过是“插件引擎”读取和创建了插件实体对象罢了。
虽然,桌面应用程序已经渐渐淡出我们的视线,市场的需求也越来越少,但是插件开发的思想依然可以给我们很多的启示,从中也可以能学到很多的知识,这些都会使我们受用终生。
相关链接:
基于 LiuZhenHong.Controls 2.X 控件开发的插件应用程序Demo:
http://download.csdn.net/detail/ll_zz_hh_/6022221
完整的GISShare.Controls.WinForm控件及插件源码(最新):
GitHub - gisshare2015/GISShare.Controls.WinForm: 基于.NET开发的WinForm自定义控件
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/我家自动化/article/detail/861076
推荐阅读
article
Hadoop
管理界面报错这个问题是怎么回事_partialgroup
name
exception th...
Hadoop
配置错误:如果你的
Hadoop
配置文件有误,例如 core-site.xml、hdfs-site.xm...
赞
踩
article
【
NodeJs
】
NodeJs
概述特点及适用场景并使用
NodeJS
创建
第一个
web
应用
_
nodejs
介...
文章目录一、
NodeJS
介绍
1.1、Node.js 概述1.2、Node.js 特点1.3、Node.js 适用场景二、...
赞
踩
article
深度
学习
落地实战:基于
GAN
(
生成
对抗
网络
)
生成
图片...
大家好,我是机长本专栏将持续收集整理市场上
深度
学习
的相关项目,旨在为准备从事
深度
学习
工作或相关科研活动的伙伴,储备、提升...
赞
踩
article
计算机
视觉
方向
相关
论文
下载_
计算机
视觉
会议
文献
出版社
怎么找...
这篇文章介绍了
计算机
视觉
领域
相关
论文
的下载方式,包括顶级
会议
和期刊以及一些在线数据库的网址。文章还提到了一个特定
论文
的标...
赞
踩
article
django
haystack
...
# coding=utf-8from
haystack
import indexesfrom yw_asset.mode...
赞
踩
article
共享
文件
时提示“将
安全性
信息
应用
到以下
对象
时发生错误”...
在给某
文件
夹设置用户权限时发生错误,提示”将
安全性
信息
应用
到以下
对象
时发生错误”,点击继续其它子
文件
及
文件
夹依然如此。故...
赞
踩
article
使用
sourcetree
进行
重置
代码
,
回滚
到
指定节点
。
_
sourcetree
回滚
...
首先在要退回的版本上右键
,
选择
重置
到
这次提交
。
重置
到
这次提交选择强行合并
,
确定
。
强行合并在最新的版本上右键
,
选择
重置
到
这...
赞
踩
article
基于
FPGA
的数字密码锁设计
Verilog
代码
Quartus
EPM240
-
CPLD
开发板
_epm板...
本文详细介绍了如何使用
Verilog
语言在
Quartus
工具下,为
EPM240
-
CPLD
开发板
设计一个数字密码锁系统,包...
赞
踩
article
IDEA
2022
如何创建
web
项目
_
2022
版
的
idea
里面没有
web
...
简介:本文讲解最新版
的
IDEA
2022
如何创建
web
项目
。_
2022
版
的
idea
里面没有
web
2022
版
的
idea
里面没...
赞
踩
article
VSCode
插件之 -
GitLens
_
moose
vscode
...
Visual Studio Code 因为相对小巧和扩展性,使用的人越来越多。很多聪明的孩子总是不安于现状,Git 代码...
赞
踩
article
百度新闻
爬虫
_百度
爬虫
csdn
...
这是本项目的开篇,在这个小项目中,将要基于
爬虫
和GUI编程写一个写个小工具,目的是不用打开浏览器,也能搜到一些关键信息,...
赞
踩
article
【容器】【
Linux
】
CentOS
9
使用
Docker
镜像
实现交叉
编译
...
之后就可以拉取
镜像
了,由于一些原因,无法从
Docker
Hub拉取
镜像
,此时通常有两种办法,一种是找国内对应的
镜像
仓库,另...
赞
踩
article
插件
化
开发_
插件
化
目的...
一、什么是Android
插件
化
android
插件
化
就是不用安装就能被宿主app调动运行。
插件
化
的目的就是要减小宿主程...
赞
踩
article
计算机
视觉
顶尖期刊和
会议
的
段子...
点击上方“3D
视觉
工坊”,选择“星标”干货第一时间送达CVPR/ICCV/ECCV常见论文:1.我们在imagenet上...
赞
踩
article
力扣
第
314
场
周赛
+
acwing
第
72
场
周赛
...
力扣
第
314
场
周赛
+
acwing
第
72
场
周赛
力扣
第
314
场
周赛
+
acwing
第
72
场
周赛
...
赞
踩
article
SpringCloud
实用篇01【微
服务
+
Eureka
+
Ribbon
+
Nacos
】_springcl...
一个大型的互联网项目往往会包含数百上千的
服务
,最终形成一个集群,而一个业务往往会需要有多个
服务
来共同来完成。一个请求来了...
赞
踩
article
Git使用——
工作
区
和
暂存
区
_
git
暂存
区
和
工作
区
...
阅读本文,走进Git内部世界一探究竟!_
git
暂存
区
和
工作
区
git
暂存
区
和
工作
区
目录 ...
赞
踩
article
【
Python
】已解决:安装
python
-
Levenshtein
包时遇到的
subprocess
-ex...
在安装
python
-
Levenshtein
这个
Python
包时,有时会遇到
subprocess
-exited-
with
-...
赞
踩
article
Win10
【
无线
显示器
】
安装
失败
(无法添加)解决中。。。_
无线
显示器
安装
失败
...
========_
无线
显示器
安装
失败
无线
显示器
安装
失败
目录 ■
失败
现象 ■解决方法 【...
赞
踩
article
Git
详解(带图) ---
本地
电脑的工作
区
、
暂存
区
、
本地
仓与远程仓_
git
工作
区
域_
git
暂存
区
...
到此我们就知道了工作
区
、
暂存
区
、
本地
仓库
在
自己的电脑到底是如何存
在
的,以及他们之间是如何运作产生联系的,
本地
仓库就是 ....
赞
踩
相关标签
hadoop
大数据
hdfs
前端
javascript
服务器
node.js
后端
深度学习
生成对抗网络
人工智能
计算机视觉
github
git
fpga开发
java
http
爬虫
百度新闻
搜索引擎
linux
centos
docker
编程语言