top
Loading...
Java模式設計之多態模式與多語言支持

作為對象的創建模式,多態模式中的多態類可有多個實例;而且多態類必須自己創建、管理自己的實例,并向外界提供自己的實例。讀者在閱讀本文的時候,可以參考閱讀筆者的《Java與模式》一書(剛由電子工業出版社出版)中的相關章節。

引言 一個真實的項目

這是一個真實的、面向全球消費者的華爾街金融網站項目的一部份。按照項目計劃書,這個網站系統是要由數據庫驅動的,并且要支持十九種不同的語言;而且在將來支持更多的語言。消費者在登錄到系統上時可以選擇自己所需要的語言,系統則根據用戶的選擇將網站的靜態文字和動態文字全部轉換為用戶所選擇的語言。

經過討論,設計師們同意對靜態文字和動態文字采取不同的解決方案:

把所有的網頁交給翻譯公司對上面的靜態文字進行翻譯, 而網頁上面的動態內容則需要程序解決。

在進行了研究后,設計師們發現,他們需要解決的動態文字的“翻譯”問題,實際上是將數據庫中的一些靜態或者半靜態的數據進行“翻譯”。下面就是一個典型的數據表:

貨幣代碼貨幣名稱貨幣尾數
USDAmerica (United States of America), Dollars2
CNYChina, Yuan Renminbi2
EURFrance, Euro2
JPYJapan, Yen0

代碼清單1、為英文用戶的準備的貨幣列表。

貨幣代碼永遠是上面所看到的英文代碼,但是貨幣名稱應當根據用戶所選擇的語言不同而不同。比如對中文讀者就應當翻譯成為下面的表:

貨幣代碼貨幣名稱貨幣尾數
USD美國 (美利堅合眾國), 美元2
CNY中國,人民幣元2
EUR法國, 歐元2
JPY日本, 日元0

代碼清單2、為中文用戶準備的貨幣列表。

這樣的表會在網頁上作為下拉菜單出現,用戶看到的是貨幣名稱,而系統內部使用的是貨幣代碼。

國際化解決方案

這樣的問題就是國際化的問題,所謂國際化就是Internationalization,簡稱作i18n(請參見本章最后的問答題)。

設計師所采取的實際方案是分層方案,也就是MVC模式。MVC模式將系統分為三個層次,也就是模型(Model)、視圖(View)、控制器(Control)三個部份。國際化是視圖部份的問題,因此應當在視圖部份得到解決。



圖1、MVC模式的示意圖。

換言之,系統的內核可以是純英文的;在內核外部增加一個殼層負責語言翻譯工作。請見下面的概念圖:



圖2、英文內核和翻譯殼層的概念圖。

所謂內核就是系統的模型,而翻譯殼層便是視圖的一部份。對多語言的支持屬于視圖功能,因此不應當在內核解決,而應當在視圖解決。這就是設計師們達成的總體方案。

多態模式 多態模式的特點

所謂的多態模式(Multiton Pattern),實際上就是單態模式的自然推廣。作為對象的創建模式,多態模式或多態類有以下的特點:

多態類可有多個實例; 多態類必須自己創建、管理自己的實例,并向外界提供自己的實例。
單態類一般情況下最多只可以有一個實例,請見下面的結構圖:



圖3、單態類的結構圖。

但是單態模式的精神是允許有限個實例,并不是僅允許一個實例;這種最多只允許有限多個實例,并向整個JVM提供自己實例的類叫做多態類(Multiton),這種模式叫做多態模式(Multiton Pattern),請參見下面的結構圖。



圖4、多態類的結構圖。

本章就需要用多態模式來實現資源對象,需要構造出能提供有限個實例,每個實例有各不相同的屬性(即Locale代碼)。

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗