簡介
在軟體工程,
軟體程式的設計一般採用
模組化設計方法,同時也儘可能實現代碼復用。Javabeans程式模組技術恰巧符合這兩點,這是使用Javabeans程式模組技術構造軟體程式一個重要原因,其中代碼復用基於bean是一個可重用的軟體構件。代碼復用,也被稱作
軟體復用,就是再利用已有的代碼,或者相關的知識去編寫新的代碼來構造軟體。不同版本的Javabean程式模組需要的修改較少,因此軟體程式使用Javabeans程式模組技術能夠較好地實現不同軟體版本之間兼容性、減少修改工作量和具有較好的移植性。
JavaBeans
JavaBeans是Java中一種特殊的類,可以將多個對象封裝到一個對象(bean)中。特點是可序列化,提供無參構造器,提供getter方法和setter方法訪問對象的屬性。JavaBean可分為兩種:一種是有用戶界面(UI,User Interface)的JavaBean;還有一種是沒有用戶界面,主要負責處理事務(如數據運算,操縱資料庫)的JavaBean。
優點
Bean可以控制它的屬性、事件和方法是否暴露給其他程式。
Bean可以接收來自其他對象的事件,也可以產生事件給其他對象。
有軟體可用來配置Bean。
Bean的屬性可以被序列化,以供日後重用。
JavaBeans體系結構特徵
設計模式
JavaBean最重要的特徵就是它只是標準化的一個層次。設計模式(即編碼約定) 可以使工具和人們識別出一個JavaBean的基本特性,並且加以處理,而無需了解它是如何實現的。可以稱Bean是“自描述的”(self-documenting)。通過分析一個Bean,可以指出它能夠激活和接收什麼事件;也可以掌握其特性 (等價於它的公共變數)和方法。對於Bean特為IDE而設計的性質,它還能夠提供有關的顯式信息。
反射
反射(Reflection)是Java語言的一個重要特性。基於反射,Java代碼則有可能在運行時檢查和處理新的Java對象。在JavaBeans領域中,反射允許開發工具分析Bean的功能,還可以檢查其欄位的值並調用其方法。本質上說,反射使得在運行時匯集在一起的Java對象也可以做任何事情,就好像這些對象是在編譯時匯合的一樣。即使一個Bean並沒有與任何“內置” 文檔相綁定,通過使用反射來直接審查該類,我們仍然可以收集到有關其功能和特性的信息。
對象串列化
最後,Java串列化API (Java Serialization API) 使我們可以將一個活動的套用或套用組件“冰凍” (有人更喜歡“醃製(pickle)”這個詞),以後再將其復原。這是很重要的一步; 這樣就有可能將套用接合起來而無需生成過多的代碼。在此不必在啟動時定製和編譯大量的Java代碼來構建套用,而只需將Bean 貼上在一起,對其進行配置,調整其外觀,然後保存就可以了。在此之後,這些Bean還可以恢復,而其狀態以及相互連線均可做到原封不動的保留。由此,對於設計過程的考慮就有可能存在各種各樣的方法。另外,對於從手寫Java代碼得到的串列化對象,使用起來也很容易,因此可以任意地將“冰凍”的Bean 與原有的Bean類以及其他Java代碼加以混合。在Java 1.4中,增加了一種“長期”對象串列化機制,它可以把JavaBean用一種
XML格式來保存,從而能夠很好地感知類中所做的修改。
組成部分
屬性(properties)
JavaBean提供了高層次的屬性概念,屬性在JavaBean中不只是傳統的面向對象的概念里的屬性,它同時還得到了屬性讀取和屬性寫入的API的支持。屬性值可以通過調用適當的bean方法進行。比如,可能bean有一個名字屬性,這個屬性的值可能需要調用String getName()方法讀取,而寫入屬性值可能要需要調用void setName(String str)的方法。
每個JavaBean屬性通常都應該遵循簡單的方法命名規則,這樣應用程式構造器工具和最終用戶才能找到JavaBean提供的屬性,然後查詢或修改屬性值,對bean進行操作。JavaBean還可以對屬性值的改變作出及時的反應。比如一個顯示當前時間的JavaBean,如果改變時鐘的時區屬性,則時鐘會立即重畫,顯示當前指定時區的時間。
方法(method)
JavaBean中的方法就是通常的Java方法,它可以從其他組件或在腳本環境中調用。默認情況下,所有bean的公有方法都可以被外部調用,但bean一般只會引出其公有方法的一個子集。
由於JavaBean本身是Java對象,調用這個對象的方法是與其互動作用的唯一途徑。JavaBean嚴格遵守面向對象的類設計邏輯,不讓外部世界訪問其任何欄位(沒有public欄位)。這樣,方法調用是接觸Bean的唯一途徑。
但是和普通類不同的是,對有些Bean來說,採用調用實例方法的低級機制並不是操作和使用Bean的主要途徑。公開Bean方法在Bean操作中降為輔助地位,因為兩個高級Bean特性--屬性和事件是與Bean互動作用的更好方式。
因此Bean可以提供要讓客戶使用的public方法,但應當認識到,Bean設計人員希望看到絕大部分Bean的功能反映在屬性和事件中,而不是在人工調用和各個方法中。
事件(event)
Bean與其他軟體組件交流信息的主要方式是傳送和接受事件。我們可以將bean的事件支持功能看作是積體電路中的輸入輸出引腳:工程師將引腳連線在一起組成系統,讓組件進行通訊。有些引腳用於輸入,有些引腳用於輸出,相當於事件模型中的傳送事件和接收事件。
事件為JavaBean組件提供了一種傳送通知給其他組件的方法。在AWT事件模型中,一個事件源可以註冊事件監聽器對象。當事件源檢測到發生了某種事件時,它將調用事件監聽器對象中的一個適當的事件處理方法來處理這個事件。
模組設計
程式模組(program module)即可由
彙編程式、
編譯程式、
裝入程式或
翻譯程式作為一個整體來處理的一級獨立的、可識別的程式指令。 它是大型程式指令的一個組成部分。 在Windows中,術語“模組”一般是指任何能被裝入記憶體中運行的
可執行代碼和數據的集合。更明確地講,模組指的就是一個。EXE檔案(又稱為應用程式模組),或一個
動態程式庫(DLL — Dynamic Linking Library,又被稱為動態程式庫模組或DLL模組),或一個設備
驅動程式,也可能是一個程式包含的能被另一個程式存取的數據資源。模組一詞也被用於特指自包含的一段程式。
模組化是個一般概念,這一概念也適用於軟體開發,可以讓軟體按模組單獨開發,各模組通常都用一個標準化的接口來進行通信。實際上,除了規模大小有區別外,面向對象語言中對象之間的關注點分離與模組化的概念基本一致。通常,把系統劃分外多個模組有助於將耦合減至最低,讓代碼維護更加簡單。
程式模組設計將一個大程式劃分成幾個功能相對獨立的
程式模組,然後再對各模組進行程式設計。只要模組間的接口關係不變,每個模組內部的具體實現細節可隨意修改。這種程式設計方法稱模組程式設計。對模組程式的要求有:(1)各模組的獨立性要強。即在同一模組內的結構要素(語句或數據)之間具有較強的相關性(模組強度高),模組之間的相關性儘量少(耦合度弱)。一旦整個程式實現的任務需作一點變更時,或者要修改某個錯誤時,只需修改個別模組,不必修改全部程式。(2)選出通用模組,最大限度地利用可利用的模組。(3)各模組的大小要適當,需要細分的模組要細分,小模組能被上層模組吸收的要吸收進去。
這樣設計出的模組便具有可修改性、可讀性、可檢驗性。
模組程式設計的優點在於可以把大型程式分解為子模組,便於進行程式設計。模組的相對獨立使它們便於共享,提高了程式設計的效率。
目前模組程式已發展為層次模組程式,使模組間又具有層次結構關係,即按照上層模組調用下層模組的原則建立起來的分層結構,因而使設計出來的程式具有較好的結構和可理解性,調試和修改都方便。
代碼實現
public class PersonBean implements java.io.Serializable {
/**
* name 屬性(注意大小寫)
*/
private String name = null;
private boolean deceased = false;
/** 無參構造器(沒有參數) */
public PersonBean() {
}
/**
* name 屬性的Getter方法
*/
public String getName() {
return name;
}
/**
* name 屬性的Setter方法
* @param value
*/
public void setName(final String value) {
name = value;
}
/**
* deceased 屬性的Getter方法
* 布爾型屬性的Getter方法的不同形式(這裡使用了is而非get)
*/
public boolean isDeceased() {
return deceased;
}
/**
* deceased 屬性的Setter方法
* @param value
*/
public void setDeceased(final boolean value) {
deceased = value;
}
}