框架(Framework)是整個或部分系統(tǒng)的可重用設(shè)計,表現(xiàn)為一組抽象構(gòu)件及構(gòu)件實例間交互的方法;另一種定義認(rèn)為,框架是可被應(yīng)用開發(fā)者定制的應(yīng)用骨架。前者是從應(yīng)用方面而后者是從目的方面給出的定義。
可以說,一個框架是一個可復(fù)用的設(shè)計構(gòu)件,它規(guī)定了應(yīng)用的體系結(jié)構(gòu),闡明了整個設(shè)計、協(xié)作構(gòu)件之間的依賴關(guān)系、責(zé)任分配和控制流程,表現(xiàn)為一組抽象類以及其實例之間協(xié)作的方法,它為構(gòu)件復(fù)用提供了上下文(Context)關(guān)系。因此構(gòu)件庫的大規(guī)模重用也需要框架。
構(gòu)件領(lǐng)域框架方法在很大程度上借鑒了硬件技術(shù)發(fā)展的成就,它是構(gòu)件技術(shù)、軟件體系結(jié)構(gòu)研究和應(yīng)用軟件開發(fā)三者發(fā)展結(jié)合的產(chǎn)物。在很多情況下,框架通常以構(gòu)件庫的形式出現(xiàn),但構(gòu)件庫只是框架的一個重要部分?蚣艿年P(guān)鍵還在于框架內(nèi)對象間的交互模式和控制流模式。
框架比構(gòu)件可定制性強(qiáng)。在某種程度上,將構(gòu)件和框架看成兩個不同但彼此協(xié)作的技術(shù)或許更好。框架為構(gòu)件提供重用的環(huán)境,為構(gòu)件處理錯誤、交換數(shù)據(jù)及激活操作提供了標(biāo)準(zhǔn)的方法。
應(yīng)用框架的概念也很簡單。它并不是包含構(gòu)件應(yīng)用程序的小片程序,而是實現(xiàn)了某應(yīng)用領(lǐng)域通用完備功能(除去特殊應(yīng)用的部分)的底層服務(wù)。使用這種框架的編程人員可以在一個通用功能已經(jīng)實現(xiàn)的基礎(chǔ)上開始具體的系統(tǒng)開發(fā)?蚣芴峁┝怂袘(yīng)用期望的默認(rèn)行為的類集合。具體的應(yīng)用通過重寫子類(該子類屬于框架的默認(rèn)行為)或組裝對象來支持應(yīng)用專用的行為。
應(yīng)用框架強(qiáng)調(diào)的是軟件的設(shè)計重用性和系統(tǒng)的可擴(kuò)充性,以縮短大型應(yīng)用軟件系統(tǒng)的開發(fā)周期,提高開發(fā)質(zhì)量。與傳統(tǒng)的基于類庫的面向?qū)ο笾赜眉夹g(shù)比較,應(yīng)用框架更注重于面向?qū)I(yè)領(lǐng)域的軟件重用。應(yīng)用框架具有領(lǐng)域相關(guān)性,構(gòu)件根據(jù)框架進(jìn)行復(fù)合而生成可運(yùn)行的系統(tǒng)?蚣艿牧6仍酱螅渲邪念I(lǐng)域知識就更加完整。
框架,即framework。其實就是某種應(yīng)用的半成品,就是一組組件,供你選用完成你自己的系統(tǒng)。簡單說就是使用別人搭好的舞臺,你來做表演。而且,框架一般是成熟的,不斷升級的軟件。
框架的概念最早起源于Smalltalk環(huán)境,其中最著名的框架是Smalltalk 80的用戶界面框架MVC(Model-View-Controller)。隨著用戶界面框架Interviews 【Linton 89】和ET++ 【W(wǎng)einand 89】 的開發(fā)和發(fā)布,框架研究越來越受到研究人員的重視。雖然框架研究最初起源于用戶界面領(lǐng)域,但它還被成功地應(yīng)用到其他領(lǐng)域中,如操作系統(tǒng) 【Russo 90】、火警系統(tǒng) 【Molin 96a,Molin 96b】 等。Taligent公司于1992年成立后,框架研究受到了廣泛的重視。該公司計劃基于框架來開發(fā)一個完整的面向?qū)ο蟛僮飨到y(tǒng)。另外,該公司還發(fā)布了一套支持快速應(yīng)用開發(fā)的工具集CommonPoint,其中包括了上百個面向?qū)ο罂蚣?【Andert 94,Cotter 95】。
框架目前還沒有統(tǒng)一的定義,其中Ralph Johnson所給出的定義基本上為大多數(shù)研究人員所接受:
一個框架是一個可復(fù)用設(shè)計,它是由一組抽象類及其實例間協(xié)作關(guān)系來表達(dá)的 【Johnson 98】。
這個定義是從框架內(nèi)涵的角度來定義框架的,當(dāng)然也可以從框架用途的角度來給出框架的定義:
一個框架是在一個給定的問題領(lǐng)域內(nèi),一個應(yīng)用程序的一部分設(shè)計與實現(xiàn)【Bosch 97】。
從以上兩個定義可以看出,框架是對特定應(yīng)用領(lǐng)域中的應(yīng)用系統(tǒng)的部分設(shè)計和實現(xiàn),它定義了一類應(yīng)用系統(tǒng)(或子系統(tǒng))的整體結(jié)構(gòu)?蚣軐(yīng)用系統(tǒng)劃分為類和對象,定義類和對象的責(zé)任,類和對象如何互相協(xié)作,以及對象之間的控制線程。這些共有的設(shè)計因素由框架預(yù)先定義,應(yīng)用開發(fā)人員只須關(guān)注于特定的應(yīng)用系統(tǒng)特有部分?蚣芸坍嬃似鋺(yīng)用領(lǐng)域所共有的設(shè)計決策,所以說框架著重于設(shè)計復(fù)用,盡管框架中可能包含用某種程序設(shè)計語言實現(xiàn)的具體類。
一個基于框架開發(fā)的應(yīng)用系統(tǒng)包含一個或多個框架,與框架相關(guān)的構(gòu)件類,以及與應(yīng)用系統(tǒng)相關(guān)的功能擴(kuò)展。與應(yīng)用系統(tǒng)相關(guān)的擴(kuò)展包括與應(yīng)用系統(tǒng)相關(guān)的類??一部分,或者說,它可能需要對框架進(jìn)行一些適應(yīng)性修改,以滿足系統(tǒng)需求。
面向?qū)ο蟮目蚣茏鳛橐环N可復(fù)用的軟件,在基于框架的軟件開發(fā)過程中會涉及到框架的開發(fā)和利用兩個方面的工作。框架的開發(fā)階段在于產(chǎn)生領(lǐng)域中可復(fù)用的設(shè)計。該階段的主要結(jié)果是框架以及與框架相關(guān)的構(gòu)件類。該階段的一個重要活動是框架的演變和維護(hù)。象所有軟件一樣,框架也易于變化。產(chǎn)生變化的原因很多,如應(yīng)用出錯,業(yè)務(wù)領(lǐng)域變化,等等。
不論是哪一種技術(shù),最終都是為業(yè)務(wù)發(fā)展而服務(wù)的。從業(yè)務(wù)的角度來講。首先,框架的是為了企業(yè)的業(yè)務(wù)發(fā)展和戰(zhàn)略規(guī)劃而服務(wù)的,他服從于企業(yè)的愿景(vision);其次,框架最重要的目標(biāo)是提高企業(yè)的競爭能力,包括降低成本、提高質(zhì)量、改善客戶滿意程度,控制進(jìn)度等方面。最后,框架實現(xiàn)這一目標(biāo)的方式是進(jìn)行有效的知識積累。軟件開發(fā)是一種知識活動,因此知識的聚集和積累是至關(guān)重要的。框架能夠采用一種結(jié)構(gòu)化的方式對某個特定的業(yè)務(wù)領(lǐng)域進(jìn)行描述,也就是將這個領(lǐng)域相關(guān)的技術(shù)以代碼、文檔、模型等方式固化下來。
一、框架要解決的問題
框架要解決的最重要的一個問題是技術(shù)整合的問題,在J2EE的框架中,有著各種各樣的技術(shù),不同的軟件企業(yè)需要從J2EE中選擇不同的技術(shù),這就使得軟件企業(yè)最終的應(yīng)用依賴于這些技術(shù),技術(shù)自身的復(fù)雜性和技術(shù)的風(fēng)險性將會直接對應(yīng)用造成沖擊。而應(yīng)用是軟件企業(yè)的核心,是競爭力的關(guān)鍵所在,因此應(yīng)該將應(yīng)用自身的設(shè)計和具體的實現(xiàn)技術(shù)解耦。這樣,軟件企業(yè)的研發(fā)將集中在應(yīng)用的設(shè)計上,而不是具體的技術(shù)實現(xiàn),技術(shù)實現(xiàn)是應(yīng)用的底層支撐,它不應(yīng)該直接對應(yīng)用產(chǎn)生影響。
要理解這一點(diǎn),我們來舉一些例子:
一個做視頻流應(yīng)用的軟件企業(yè),他為電廣行業(yè)提供整體的解決方案。他的優(yōu)勢在于將各種各樣的視頻硬件、服務(wù)器、和管理結(jié)合起來,因此他扮演的是一個集成商的角色。因此他的核心價值在于使用軟件技術(shù)將不同的硬件整合起來,并在硬件的整合層面上提供一個統(tǒng)一的管理平臺。所以他的精力應(yīng)該放在解決兩個問題:
如何找到一種方法,將不同的硬件整合起來,注意,這里的整合并不是技術(shù)整合,而是一種思路上的整合。首先要考慮的絕對不是要使用什么技術(shù),而是這些硬件需要提供哪些服務(wù),需要以什么樣的方式進(jìn)行管理。因此,這時候做的事情實際上是對領(lǐng)域進(jìn)行建模。例如,我們定義任何一種硬件都需要提供兩種能力,一種是統(tǒng)一的管理接口,用于對所有硬件統(tǒng)一管理;另一種是服務(wù)接口,系統(tǒng)平臺可以查詢硬件所能夠提供的服務(wù),并調(diào)用這些服務(wù)。所以,設(shè)計的規(guī)范將會針對兩種能力進(jìn)行。
另一個問題是如何描述這個管理系統(tǒng)的規(guī)范。你需要描述各種管理活動,以及管理中所涉及的不同實體。因為管理系統(tǒng)是針對硬件的管理,所以它是構(gòu)架在硬件整合平臺之上的。
在完成業(yè)務(wù)層面的設(shè)計之后,我們再來看看具體的技術(shù)實現(xiàn)。光有規(guī)范和設(shè)計是不夠的,我們還需要選擇一個優(yōu)秀的技術(shù)。由于是對不同硬件的整合,我們想到采用Java提供的JMX技術(shù)。JMX技術(shù)適合用來進(jìn)行系統(tǒng)整合,它定義了一個通用的規(guī)范,并給出了遠(yuǎn)程管理端口的一些默認(rèn)實現(xiàn)。JMX已經(jīng)經(jīng)過了實踐的檢驗,不少的應(yīng)用服務(wù)器都采用了以JMX為基礎(chǔ)的結(jié)構(gòu),例如有名的JBoss。JMX已經(jīng)是一個很好的開始了,但是我們還需要在JMX的基礎(chǔ)上再做一些工作。
二、什么要用框架?
因為軟件系統(tǒng)發(fā)展到今天已經(jīng)很復(fù)雜了,特別是服務(wù)器端軟件,設(shè)計到的知識,內(nèi)容,問題太多。在某些方面使用別人成熟的框架,就相當(dāng)于讓別人幫你完成一些基礎(chǔ)工作,你只需要集中精力完成系統(tǒng)的業(yè)務(wù)邏輯設(shè)計。而且框架一般是成熟,穩(wěn)健的,他可以處理系統(tǒng)很多細(xì)節(jié)問題,比如,事物處理,安全性,數(shù)據(jù)流控制等問題。還有框架一般都經(jīng)過很多人使用,所以結(jié)構(gòu)很好,所以擴(kuò)展性也很好,而且它是不斷升級的,你可以直接享受別人升級代碼帶來的好處。
框架一般處在低層應(yīng)用平臺(如J2EE)和高層業(yè)務(wù)邏輯之間的中間層。
軟件為什么要分層?
為了實現(xiàn)“高內(nèi)聚、低耦合”。把問題劃分開來各個解決,易于控制,易于延展,易于分配資源…總之好處很多啦:)。
三、為什么要進(jìn)行框架開發(fā)?
框架的最大好處就是重用。面向?qū)ο笙到y(tǒng)獲得的最大的復(fù)用方式就是框架,一個大的應(yīng)用系統(tǒng)往往可能由多層互相協(xié)作的框架組成。
由于框架能重用代碼,因此從一已有構(gòu)件庫中建立應(yīng)用變得非常容易,因為構(gòu)件都采用框架統(tǒng)一定義的接口,從而使構(gòu)件間的通信簡單。
框架能重用設(shè)計。它提供可重用的抽象算法及高層設(shè)計,并能將大系統(tǒng)分解成更小的構(gòu)件,而且能描述構(gòu)件間的內(nèi)部接口。這些標(biāo)準(zhǔn)接口使在已有的構(gòu)件基礎(chǔ)上通過組裝建立各種各樣的系統(tǒng)成為可能。只要符合接口定義,新的構(gòu)件就能插入框架中,構(gòu)件設(shè)計者就能重用構(gòu)架的設(shè)計。
框架還能重用分析。所有的人員若按照框架的思想來分析事務(wù),那么就能將它劃分為同樣的構(gòu)件,采用相似的解決方法,從而使采用同一框架的分析人員之間能進(jìn)行溝通。
采用框架技術(shù)進(jìn)行軟件開發(fā)的主要特點(diǎn)包括:
領(lǐng)域內(nèi)的軟件結(jié)構(gòu)一致性好;
建立更加開放的系統(tǒng);
重用代碼大大增加,軟件生產(chǎn)效率和質(zhì)量也得到了提高;
軟件設(shè)計人員要專注于對領(lǐng)域的了解,使需求分析更充分;
存儲了經(jīng)驗,可以讓那些經(jīng)驗豐富的人員去設(shè)計框架和領(lǐng)域構(gòu)件,而不必限于低層編程;
允許采用快速原型技術(shù);
有利于在一個項目內(nèi)多人協(xié)同工作;
大粒度的重用使得平均開發(fā)費(fèi)用降低,開發(fā)速度加快,開發(fā)人員減少,維護(hù)費(fèi)用降低,而參數(shù)化框架使得適應(yīng)性、靈活性增強(qiáng)。
四、與框架相關(guān)的概念
1. 白盒與黑盒框架
框架可分為白盒(White-Box)與黑盒(Black-Box)兩種框架。
基于繼承的框架被稱為白盒框架。所謂白盒即具備可視性,被繼承的父類的內(nèi)部實現(xiàn)細(xì)節(jié)對子類而言都是可知的。利用白盒框架的應(yīng)用開發(fā)者通過衍生子類或重寫父類的成員方法來開發(fā)系統(tǒng)。子類的實現(xiàn)很大程度上依賴于父類的實現(xiàn),這種依賴性限制了重用的靈活性和完全性。但解決這種局限性的方法可以是只繼承抽象父類,因為抽象類基本上不提供具體的實現(xiàn)。白盒框架是一個程序骨架,而用戶衍生出的子類是這個骨架上的附屬品。
基于對象構(gòu)件組裝的框架就是黑盒框架。應(yīng)用開發(fā)者通過整理、組裝對象來獲得系統(tǒng)的實現(xiàn)。用戶只須了解構(gòu)件的外部接口,無須了解內(nèi)部的具體實現(xiàn)。另外,組裝比繼承更為靈活,它能動態(tài)地改變,繼承只是一個靜態(tài)編譯時的概念。
在理想情況下,任何所需的功能都可通過組裝已有的構(gòu)件得到,事實上可獲得的構(gòu)件遠(yuǎn)遠(yuǎn)不能滿足需求,有時通過繼承獲得新的構(gòu)件比利用已有構(gòu)件組裝新構(gòu)件更容易,因此白盒和黑盒將同時應(yīng)用于系統(tǒng)的開發(fā)中。不過白盒框架趨向于向黑盒框架發(fā)展,黑盒框架也是系統(tǒng)開發(fā)希望達(dá)到的理想目標(biāo)。
2. 熱點(diǎn)、食譜以及好萊塢原則
成功的框架開發(fā)需要確定領(lǐng)域?qū)S玫摹盁狳c(diǎn)” (Hot spot)。應(yīng)用開發(fā)者在框架的基礎(chǔ)上進(jìn)行開發(fā),只須擴(kuò)展框架的某些部分,“熱點(diǎn)”就是在應(yīng)用領(lǐng)域的一種擴(kuò)展槽,開發(fā)者根據(jù)自己的需要填充這些擴(kuò)展槽!盁狳c(diǎn)”使框架具有靈活性,如在具體的實現(xiàn)中,擴(kuò)展槽可以被看成是一些抽象類,開發(fā)者通過重寫抽象方法獲得具體實現(xiàn)。
“食譜” (Cookbook)就是描述如何使用框架方法的文檔。在“食譜”中包含了許多“烹飪”方法,這些“烹飪”方法相當(dāng)于一些具體的操作步驟,描述了為解決某一專門問題如何使用框架的詳細(xì)方法?蚣艿膬(nèi)部設(shè)計和實現(xiàn)細(xì)節(jié)通常不出現(xiàn)在“食譜”中。
框架的一個重要特征就是用戶定義的方法經(jīng)常被框架自身調(diào)用,而不是從用戶的應(yīng)用代碼中調(diào)用。這種機(jī)制常稱為“好萊塢原則”(Hollywood Principle)或“別調(diào)用我們,我們會調(diào)用您”。
五、常見的JAVA框架有什么?
WAF:
全稱:WEB APPLICATION FRAMEWORK
主要應(yīng)用方面:EJB層,(WEB層也有,但是比較弱)。
主要應(yīng)用技術(shù):EJB等
出處:java.sun.com/blueprints/code/index.html">http://java.sun.com/blueprints/code/index.html
簡述:這是SUN在展示J2EE平臺時所用的例子PetStore(寵物商店系統(tǒng))里面的框架。是SUN藍(lán)皮書例子程序中提出的應(yīng)用框架。它實現(xiàn)了 MVC和其他良好的設(shè)計模式。SUN的網(wǎng)站上有技術(shù)資料,最好下載PetStore來研究,WEBLOGIC里自帶此系統(tǒng),源碼在beaweblogic700samplesserversrcpetstore。這是學(xué)習(xí)了解J2EE的首選框架。
免費(fèi)。
Struts:
主要應(yīng)用方面:WEB層。
主要應(yīng)用技術(shù):JSP,TagLib,JavaBean,XML等
出處:http://jakarta.apache.org/struts/index.html
簡述:這是APACHE的開源項目,目前應(yīng)用很廣泛。基于MVC模式,結(jié)構(gòu)很好,基于JSP。Jbuilder8里已經(jīng)集成了STRUTS1.02的制作。
免費(fèi)。
簡述WAF+STRUTS結(jié)合的例子:WEB層用STRUTS,EJB層用WAF:
JSP(TagLib)