| 導購 | 订阅 | 在线投稿
分享
 
 
 

OOP Java:beans中的一個小小的事物邏輯

來源:互聯網  2008-05-31 11:18:07  評論

傳統上,任何提供商務基本功能的軟件都涉及到了事物邏輯。除了定義爲實現標准服務或者應用程序的事物規則的代碼外,你還可以進一步定義事物邏輯的概念。事物邏輯一般與n層系統的中間層相聯系。換句話說,事物邏輯在表示層與數據訪問層之間,如圖A所示。

圖A

OOP Java:beans中的一個小小的事物邏輯

事物邏輯組建或者服務一般用來響應表示層的請求、訪問數據層中特定資源以獲取查詢結果,並把查詢結果返回到表示層。事物邏輯組件應該對任何用戶都是一碗水端平的。這就答應它們用一種與客戶無關的方式提供功能。下面,我們將看到javaBean是如何幫助你實現這一點。不過,在這之前,讓我們首先看看什麽是軟件組件(software component)以及它與對象(object)的區別。

有關組件的一個案例

軟件組件可以定義爲一種自治的、提供外部公共接口、動態可用的(dynamically discoverable)事物過程,軟件組件還可以用來構件其它組件或者應用程序。打個比方,汽車的每個零件(組件)都有明確的目的(過程),只要零件的尺寸和螺孔(接口)符合標准,它就可以用來組裝一輛完整的汽車(其它組件或者應用程序)。

也許舉個例子可以幫助你理解這一點。假設有一家低水平的軟件公司,它有如下的軟件技術:電子表格、文本編輯、圖形編輯工具、拼寫檢測。現在,假如說這些技術中的每一種都有一個對應的公共接口可供其它軟件組件或者應用程序來使用。發揮一下你的想象力,你就會發現把這些技術組合在一起形成一個功能強大的應用程序——例如字處理軟件——並不會花費多少力氣。

你也許會說:「軟件組件與對象或者代碼庫有什麽區別?」——這是個不錯的提問。讓我們看看它們之間的區別。

庫、組件和對象

單一的代碼庫是函數調用的一個邏輯上的組合,它們按照與操作系統有關的機器代碼的方式打包到一個可鏈接的文件上。在Java中,庫可能是以打包到一個JAR文件一組靜態方法的形式存在的。由于這些函數調用或者靜態方法對它們所處的環境一無所知,所以它們一般不能維護(與調用它們的客戶代碼有關的)任何一種狀態。例如,Java中的代碼庫(打包爲一組靜態方法),看上去可能向代碼清單A所示。

清單A如下:

Listing A

public class SystemLib { public static Date getDateTime() {return new Date(); } public static String getOSVersion() {return System.getPRoperty("os.version"); } }

對象把狀態和功能封裝當邏輯單元之中。一個或者多個客戶可以分享同一個對象。對象一般可以提供其中某些狀態數據以及適當的操作。代碼清單B給出了一個表示個人信息的Java對象。

代碼清單B如下:

Listing B

public class Person { protected String name; protected int age; public Person(String name, int age) {this.name = name;this.age = age; } public String getName() {return name; } public int getAge() {return age; } public String toString() {return "Name: " + name + ", Age: " + age; } }

請注重觀察Person對象是如何提供狀態數據(姓名與年齡)以及對應的一個操作(toString)。這些都是相當基本的。那麽軟件組件又有什麽好抄作的呢?

軟件組件把對象的概念向前推進了若幹步。軟件組件像對象那樣把狀態和操作封裝在同一個邏輯單元之中,但與對象不同,軟件組件還提供了動態可用的接口、屬性和操作的概念。典型的組件還提供了對象的事件概念。讓我們看看如何把Person對象擴展、提升成一個組件,代碼如清單C所示。

清單C如下:

Listing C

public class Administrator extends Person { private String rights;

private String department;

private Vector listeners = new Vector();

public Administrator(String name, int age, String rights, String department) {

super(name, age);

this.rights = rights;

this.department = department; }

public String getRights() {return rights; } public void setRights(String rights) {

this.rights = rights;

fireStateChangedEvent("Rights"); }

public String getDepartment() {return department; }

public void setDepartment(String department) {this.department = department;fireStateChangedEvent("Department"); } public void setName(String name) {this.name = name;fireStateChangedEvent("Name"); } public void setAge(int age) {this.age = age;fireStateChangedEvent("Age"); } public void addStateChangedListener(StateChangedListener l) {if (listeners.indexOf(l) == -1){ listeners.add(l);} } public void removeStateChangedListener(StateChangedListener l) {listeners.remove(l); } private void fireStateChangedEvent(String dataName) {for (Iterator iter = listeners.iterator(); iter.hasNext();){ StateChangedListener l = (StateChangedListener)iter.next(); l.stateChanged(new StateChangedEvent(this, dataName));} } public String toString() {return super.toString() + ", Rights: " + rights + ", Department: " + department; } }

Administrator類擴展了Person類,它添加了兩個新的數據(或者說屬性):權利(rights)和部門(department)。Administrator類提供了修改權利和部門屬性的操作。它還添加了改變父類(Person類)的姓名和年齡的操作。Administrator類添加了事件功能,因此有愛好的客戶可以登記爲Administrator類事件的接受者,這樣該用戶就可以知曉Administrator組件中的任何狀態改變。

Java中的Bean

Java編程語言中正式的組件模型是JavaBeans規範。該規範增加了若幹個概念以提升Java編程語言中組件的性能。其中的某些概念——屬性、事件以及方法——與其它標准組件模型中的對應概念含義相同。盡管方法的概念對JavaBeans來說並不新鮮,但是JavaBeans模型發布關于方法的信息還是可以使得在設計和運行時發現它們更輕易。

JavaBeans規範引入的最最廣爲使用的一個概念(盡管從表面上看這個概念相當的簡單)就是命名方式。命名方式就是用推薦的前綴和後綴來區分方法的簡單標准。例如,JavaBeans規範建議用來任何提供屬性值(狀態數據)的方法的名字應該有前綴get或者is。這樣,提供年齡(age)屬性值的方法應該命名爲getAge()。另外,任何修改屬性值的方法的名字都應該以set爲前綴。這樣,修改年齡屬性的方法應該命名爲setAge()。代碼清單C中的Person類就演示了如何使用這種命名方式。

JavaBeans規範中另一個廣爲使用的概念就是任何JavaBeans都要支持串行化(serialization)和具體化(externalization)的要求。這兩個要求都用來處理對象自動寫入存儲器以及從存儲器恢複的能力。串行化一般由java.io包來控制,而具體化的工作大多由單獨的類來控制。

命名方式、串行化、具體化的概念簡潔明了,它們爲Java編程語言以及Web應用程序開發環境提供了巨大的動力。讓我們看看幾種在事物邏輯層利用這些JavaBeans概念的方法。

Beans的事物邏輯層

由于JavaBeans必須支持串行化和通用命名方式,所以它們對數據傳輸組件自適應。例如,假設我們在利用銀行系統的組件和服務,那麽我們的事物邏輯層就應該考慮諸如帳號、客戶和付款之類的組件。這些組件需要在組件與組件之間、層與層之間傳遞。這個傳遞機制可能需要跨越處理邊界以及機器邊界。爲了使得組件可以方便的跨越這些邊界,該組件就需要在電纜傳輸時擁有串行化和解串行化(解串)的能力。由于JavaBeans需要支持串行化,又由于我們可以依靠JavaBeans的通用命名方式,它們可以在過程之間或者層之間動態的串行傳輸以及解串(deserialized),如圖B所示。

圖B

OOP Java:beans中的一個小小的事物邏輯

總結

我們已經介紹了如何用Java以及JavaBeans來建造事物邏輯組件以及中間件的技術。我們將在下一篇文章中介紹Enterprise JavaBeans在與其它資源交互時是如何用來封裝事物邏輯的,並由此進一步展開對事物邏輯組件的討論。

  傳統上,任何提供商務基本功能的軟件都涉及到了事物邏輯。除了定義爲實現標准服務或者應用程序的事物規則的代碼外,你還可以進一步定義事物邏輯的概念。事物邏輯一般與n層系統的中間層相聯系。換句話說,事物邏輯在表示層與數據訪問層之間,如圖A所示。   圖A    [url=/bbs/detail_1758842.html][img]http://image.wangchao.net.cn/it/1323510372118.jpg[/img][/url]   事物邏輯組建或者服務一般用來響應表示層的請求、訪問數據層中特定資源以獲取查詢結果,並把查詢結果返回到表示層。事物邏輯組件應該對任何用戶都是一碗水端平的。這就答應它們用一種與客戶無關的方式提供功能。下面,我們將看到javaBean是如何幫助你實現這一點。不過,在這之前,讓我們首先看看什麽是軟件組件(software component)以及它與對象(object)的區別。   有關組件的一個案例          軟件組件可以定義爲一種自治的、提供外部公共接口、動態可用的(dynamically discoverable)事物過程,軟件組件還可以用來構件其它組件或者應用程序。打個比方,汽車的每個零件(組件)都有明確的目的(過程),只要零件的尺寸和螺孔(接口)符合標准,它就可以用來組裝一輛完整的汽車(其它組件或者應用程序)。      也許舉個例子可以幫助你理解這一點。假設有一家低水平的軟件公司,它有如下的軟件技術:電子表格、文本編輯、圖形編輯工具、拼寫檢測。現在,假如說這些技術中的每一種都有一個對應的公共接口可供其它軟件組件或者應用程序來使用。發揮一下你的想象力,你就會發現把這些技術組合在一起形成一個功能強大的應用程序——例如字處理軟件——並不會花費多少力氣。      你也許會說:「軟件組件與對象或者代碼庫有什麽區別?」——這是個不錯的提問。讓我們看看它們之間的區別。   庫、組件和對象          單一的代碼庫是函數調用的一個邏輯上的組合,它們按照與操作系統有關的機器代碼的方式打包到一個可鏈接的文件上。在Java中,庫可能是以打包到一個JAR文件一組靜態方法的形式存在的。由于這些函數調用或者靜態方法對它們所處的環境一無所知,所以它們一般不能維護(與調用它們的客戶代碼有關的)任何一種狀態。例如,Java中的代碼庫(打包爲一組靜態方法),看上去可能向代碼清單A所示。   清單A如下:   Listing A         public class SystemLib {  public static Date getDateTime()  {   return new Date();  }  public static String getOSVersion()  {   return System.getPRoperty("os.version");  } }      對象把狀態和功能封裝當邏輯單元之中。一個或者多個客戶可以分享同一個對象。對象一般可以提供其中某些狀態數據以及適當的操作。代碼清單B給出了一個表示個人信息的Java對象。   代碼清單B如下:   Listing B         public class Person {  protected String name;  protected int age;  public Person(String name, int age)  {   this.name = name;   this.age = age;  }  public String getName()  {   return name;  }  public int getAge()  {   return age;  }  public String toString()  {   return "Name: " + name + ", Age: " + age;  } }         請注重觀察Person對象是如何提供狀態數據(姓名與年齡)以及對應的一個操作(toString)。這些都是相當基本的。那麽軟件組件又有什麽好抄作的呢?      軟件組件把對象的概念向前推進了若幹步。軟件組件像對象那樣把狀態和操作封裝在同一個邏輯單元之中,但與對象不同,軟件組件還提供了動態可用的接口、屬性和操作的概念。典型的組件還提供了對象的事件概念。讓我們看看如何把Person對象擴展、提升成一個組件,代碼如清單C所示。   清單C如下:   Listing C         public class Administrator extends Person {  private String rights;    private String department;    private Vector listeners = new Vector();    public Administrator(String name, int age, String rights, String department)  {   super(name, age);    this.rights = rights;    this.department = department;  }    public String getRights()  {   return rights;  }  public void setRights(String rights)  {    this.rights = rights;      fireStateChangedEvent("Rights");  }    public String getDepartment()  {   return department;  }    public void setDepartment(String department)  {   this.department = department;   fireStateChangedEvent("Department");  }  public void setName(String name)  {   this.name = name;   fireStateChangedEvent("Name");  }  public void setAge(int age)  {   this.age = age;   fireStateChangedEvent("Age");  }  public void addStateChangedListener(StateChangedListener l)  {   if (listeners.indexOf(l) == -1)   {     listeners.add(l);   }  }  public void removeStateChangedListener(StateChangedListener l)  {   listeners.remove(l);  }  private void fireStateChangedEvent(String dataName)  {   for (Iterator iter = listeners.iterator(); iter.hasNext();)   {     StateChangedListener l = (StateChangedListener)iter.next();     l.stateChanged(new StateChangedEvent(this, dataName));   }  }  public String toString()  {   return super.toString()     + ", Rights: " + rights + ", Department: " + department;  } }      Administrator類擴展了Person類,它添加了兩個新的數據(或者說屬性):權利(rights)和部門(department)。Administrator類提供了修改權利和部門屬性的操作。它還添加了改變父類(Person類)的姓名和年齡的操作。Administrator類添加了事件功能,因此有愛好的客戶可以登記爲Administrator類事件的接受者,這樣該用戶就可以知曉Administrator組件中的任何狀態改變。      Java中的Bean   Java編程語言中正式的組件模型是JavaBeans規範。該規範增加了若幹個概念以提升Java編程語言中組件的性能。其中的某些概念——屬性、事件以及方法——與其它標准組件模型中的對應概念含義相同。盡管方法的概念對JavaBeans來說並不新鮮,但是JavaBeans模型發布關于方法的信息還是可以使得在設計和運行時發現它們更輕易。      JavaBeans規範引入的最最廣爲使用的一個概念(盡管從表面上看這個概念相當的簡單)就是命名方式。命名方式就是用推薦的前綴和後綴來區分方法的簡單標准。例如,JavaBeans規範建議用來任何提供屬性值(狀態數據)的方法的名字應該有前綴get或者is。這樣,提供年齡(age)屬性值的方法應該命名爲getAge()。另外,任何修改屬性值的方法的名字都應該以set爲前綴。這樣,修改年齡屬性的方法應該命名爲setAge()。代碼清單C中的Person類就演示了如何使用這種命名方式。      JavaBeans規範中另一個廣爲使用的概念就是任何JavaBeans都要支持串行化(serialization)和具體化(externalization)的要求。這兩個要求都用來處理對象自動寫入存儲器以及從存儲器恢複的能力。串行化一般由java.io包來控制,而具體化的工作大多由單獨的類來控制。      命名方式、串行化、具體化的概念簡潔明了,它們爲Java編程語言以及Web應用程序開發環境提供了巨大的動力。讓我們看看幾種在事物邏輯層利用這些JavaBeans概念的方法。   Beans的事物邏輯層          由于JavaBeans必須支持串行化和通用命名方式,所以它們對數據傳輸組件自適應。例如,假設我們在利用銀行系統的組件和服務,那麽我們的事物邏輯層就應該考慮諸如帳號、客戶和付款之類的組件。這些組件需要在組件與組件之間、層與層之間傳遞。這個傳遞機制可能需要跨越處理邊界以及機器邊界。爲了使得組件可以方便的跨越這些邊界,該組件就需要在電纜傳輸時擁有串行化和解串行化(解串)的能力。由于JavaBeans需要支持串行化,又由于我們可以依靠JavaBeans的通用命名方式,它們可以在過程之間或者層之間動態的串行傳輸以及解串(deserialized),如圖B所示。   圖B   [url=/bbs/detail_1758842.html][img]http://image.wangchao.net.cn/it/1323510374357.jpg[/img][/url]   總結   我們已經介紹了如何用Java以及JavaBeans來建造事物邏輯組件以及中間件的技術。我們將在下一篇文章中介紹Enterprise JavaBeans在與其它資源交互時是如何用來封裝事物邏輯的,並由此進一步展開對事物邏輯組件的討論。
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有