插件原理[转]
本文轉(zhuǎn)自?http://450940118.blog.163.com/blog/static/430622032012128262337/
插件是一種遵循統(tǒng)一的預(yù)定義接口規(guī)范編寫出來的程序,應(yīng)用程序在運行時通過接口規(guī)范對插件進行調(diào)用,以擴展應(yīng)用程序的功能。插件在英文中通常稱為plug-in、plugin或者plug in。插件最典型的例子是Microsoft的ActiveX控件和COM(Component Object Model,部件對象模型)實際上ActiveX控件不過是一個更高繼承層次的COM而已。此外還有Photoshop的濾鏡(Filter)也是一種比較常見的插件。
??????插件最吸引人的地方當(dāng)然就是其所實現(xiàn)“運行時(run-time)"功能擴展。這意味著軟件開發(fā)者可以通過公布插件的預(yù)定義接口規(guī)范,從而允許第三方的軟件開發(fā)者通過開發(fā)插件對軟件的功能進行擴展,而無需對整個程序代碼進行重新編譯。運行時(run-time)是相對于編譯時(assembly-time)而言的。一般來說,軟件開發(fā)者對軟件功能更新時,是在源代碼級別進行更新,然后對整個程序進行重新編譯,進而發(fā)布應(yīng)用程序的新版本,這就是編譯時(assembly-time)的軟件更新。
?????插件的本質(zhì)在于不修改程序主體(平臺)的情況下對軟件功能進行擴展與加強,當(dāng)插件的接口公開后,任何公司或個人都可以制作自己的插件來解決一些操作上的不便或增加新的功能,也就是實現(xiàn)真正意義上的“即插即用”軟件開發(fā)。平臺+插件軟件結(jié)構(gòu)是將一個待開發(fā)的目標(biāo)軟件分為兩部分,一部分為程序的主體或主框架,可定義為平臺,另一部分為功能擴展或補充模塊,可定義為插件。
????在進行軟件開發(fā)之前,是否采用平臺+插件結(jié)構(gòu)進行軟件開發(fā),還要依據(jù)具體的軟件需求情況進行確定,但一般來講,使用平臺+插件結(jié)構(gòu)進行軟件設(shè)計會給所開發(fā)軟件增加新的生命力。當(dāng)確定平臺+插件的軟件結(jié)構(gòu)之后,就要分析哪些部分功能由主體完成,即平臺的基本功能,哪些部分功能由插件完成,即需要擴展的插件功能。平臺所完成的功能應(yīng)為一個軟件系統(tǒng)的核心和基礎(chǔ),這些基本功能即可為用戶使用,也可為插件使用,就是又可以把平臺基本功能分為兩個部分,內(nèi)核功能和插件處理功能。平臺的內(nèi)核功能是整個軟件的重要功能,一個軟件的大部分功能因由內(nèi)核功能完成。平臺的插件處理功能用于擴展平臺和管理插件,為插件操縱平臺和與插件通信提供標(biāo)準平臺擴展接口。插件所完成的功能是對平臺功能的擴展與補充,一般插件完成系列化功能,例如:PHOTOSHOP的濾鏡插件完成對圖形的特殊效果處理,這些功能都有一些共性,可以進行集中管理,并且是可以定義出標(biāo)準的插件接口。
????為了實現(xiàn)平臺+插件結(jié)構(gòu)的軟件設(shè)計需要定義兩個標(biāo)準接口,一個為由平臺所實現(xiàn)的平臺擴展接口,一個為插件所實現(xiàn)的插件接口。這里需要說明的是:平臺擴展接口完全由平臺實現(xiàn),插件只是調(diào)用和使用,插件接口完全由插件實現(xiàn),平臺也只是調(diào)用和使用。平臺擴展接口實現(xiàn)插件向平臺方向的單向通信,插件通過平臺擴展接口可獲取主框架的各種資源和數(shù)據(jù),可包括各種系統(tǒng)句柄,程序內(nèi)部數(shù)據(jù)以及內(nèi)存分配等。插件接口為平臺向插件方向的單向通信,平臺通過插件接口調(diào)用插件所實現(xiàn)的功能,讀取插件處理數(shù)據(jù)等。
????平臺插件處理功能包括插件注冊、管理和調(diào)用,以及平臺擴展接口的功能實現(xiàn)。插件注冊為按照某種機制首先在系統(tǒng)中搜索已安裝插件,之后將搜索到的插件注冊到平臺上,并在平臺上生成相應(yīng)的調(diào)用機制,這包括菜單選項、工具欄、內(nèi)部調(diào)用等。插件管理完成插件與平臺的協(xié)調(diào),為各插件在平臺上生成管理信息以及進行插件的狀態(tài)跟蹤。插件調(diào)用為調(diào)用各插件所實現(xiàn)的功能。平臺插件處理功能實現(xiàn)的另一部分功能為平臺擴展接口的具體實現(xiàn)。
????插件接口的認識
????開發(fā)支持插件功能的應(yīng)用程序必須解決一個問題:如何在主程序與插件間正確地互相通信。為了在主程序與插件之間能正確地互相通信,應(yīng)該先制定一套通信標(biāo)準,這套通信標(biāo)準就是接口,主程序與插件只能通過制訂好的接口進行通信。軟件開發(fā)中,接口只是定義功能并規(guī)定調(diào)用功能的形式,而不包含功能的實現(xiàn)。接口實質(zhì)上是軟件模塊的調(diào)用規(guī)范。
????就開發(fā)支持插件功能的應(yīng)用程序而言,一般來說由主程序的開發(fā)者來制訂接口,如果希望其他的開發(fā)人員能開發(fā)相關(guān)的插件,只要公開相關(guān)接口即可。接口功能一般由插件方實現(xiàn)。因為插件的實現(xiàn)也要調(diào)用主程序的功能,所以接口功能也可能由主程序來實現(xiàn)。也就是說,主程序與插件的信息流可能是雙向的。
????接口的調(diào)用規(guī)范與功能實現(xiàn)互相分離有一個很大的優(yōu)點:盡管不同的插件開發(fā)者對同一個接口的具體實現(xiàn)不同,但是在主程序中對這些插件的調(diào)用方式是一樣的。如果有主程序?qū)崿F(xiàn)的接口,在不同的插件中也可以用相同的使用方式調(diào)用主程序的功能。這極大的提高了應(yīng)用程序的靈活性。
????程序結(jié)構(gòu)及其運行機制
????主程序中,插件管理部分用于管理插件的安裝和刪除,并將所有安裝插件的信息保存到適合的地方,例如保存到注冊表或配置文件中。主程序啟動時,根據(jù)插件的配置信息加載插件模塊,然后獲得插件的輸出函數(shù)或輸出類的指針并加以保存,如果需要的話,可以向主程序增加界面接口元素,如菜單、工具條按鈕等。在主程序中當(dāng)點擊與插件相關(guān)聯(lián)的接口元素時,就會觸發(fā)插件調(diào)用函數(shù),在插件調(diào)用函數(shù)中使用主函數(shù)中所保存的插件信息調(diào)用插件中實現(xiàn)的功能。在調(diào)用插件輸出函數(shù)時也可以把主程序中實現(xiàn)的接口傳遞給插件方。
總結(jié)
- 上一篇: mysql 审计(audit)
- 下一篇: 公钥,私钥,SSL(讲的很生动)