亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

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

2019-11-18 12:17:26
字體:
來源:轉載
供稿:網友

  作為對象的創建模式,多態模式中的多態類可有多個實例;而且多態類必須自己創建、治理自己的實例,并向外界提供自己的實例。讀者在閱讀本文的時候,可以參考閱讀筆者的《java與模式》一書(剛由電子工業出版社出版)中的相關章節。
  引言 一個真實的項目
  這是一個真實的、面向全球消費者的華爾街金融網站項目的一部份。按照項目計劃書,這個網站系統是要由數據庫驅動的,并且要支持十九種不同的語言;而且在將來支持更多的語言。消費者在登錄到系統上時可以選擇自己所需要的語言,系統則根據用戶的選擇將網站的靜態文字和動態文字全部轉換為用戶所選擇的語言。
  經過討論,設計師們同意對靜態文字和動態文字采取不同的解決方案:
  把所有的網頁交給翻譯公司對上面的靜態文字進行翻譯, 而網頁上面的動態內容則需要程序解決。
  在進行了研究后,設計師們發現,他們需要解決的動態文字的“翻譯”問題,實際上是將數據庫中的一些靜態或者半靜態的數據進行“翻譯”。下面就是一個典型的數據表:
   Java模式設計之多態模式與多語言支持(圖一)
  代碼清單1、為英文用戶的預備的貨幣列表。
  貨幣代碼永遠是上面所看到的英文代碼,但是貨幣名稱應當根據用戶所選擇的語言不同而不同。比如對中文讀者就應當翻譯成為下面的表:
   Java模式設計之多態模式與多語言支持(圖二)
  代碼清單2、為中文用戶預備的貨幣列表。
  這樣的表會在網頁上作為下拉菜單出現,用戶看到的是貨幣名稱,而系統內部使用的是貨幣代碼。
  國際化解決方案
  這樣的問題就是國際化的問題,所謂國際化就是Internationalization,簡稱作i18n(請參見本章最后的問答題)。
  設計師所采取的實際方案是分層方案,也就是MVC模式。MVC模式將系統分為三個層次,也就是模型(Model)、視圖(View)、控制器(Control)三個部份。國際化是視圖部份的問題,因此應當在視圖部份得到解決。
   Java模式設計之多態模式與多語言支持(圖三)
  圖1、MVC模式的示意圖。
  換言之,系統的內核可以是純英文的;在內核外部增加一個殼層負責語言翻譯工作。請見下面的概念圖:
   Java模式設計之多態模式與多語言支持(圖四)
  圖2、英文內核和翻譯殼層的概念圖。
  所謂內核就是系統的模型,而翻譯殼層便是視圖的一部份。對多語言的支持屬于視圖功能,因此不應當在內核解決,而應當在視圖解決。這就是設計師們達成的總體方案。
  多態模式 多態模式的特點
  所謂的多態模式(Multiton Pattern),實際上就是單態模式的自然推廣。作為對象的創建模式,多態模式或多態類有以下的特點:
  多態類可有多個實例; 多態類必須自己創建、治理自己的實例,并向外界提供自己的實例。
  單態類一般情況下最多只可以有一個實例,請見下面的結構圖:
   Java模式設計之多態模式與多語言支持(圖五)
  圖3、單態類的結構圖。
  但是單態模式的精神是答應有限個實例,并不是僅答應一個實例;這種最多只答應有限多個實例,并向整個JVM提供自己實例的類叫做多態類(Multiton),這種模式叫做多態模式(Multiton Pattern),請參見下面的結構圖。
   Java模式設計之多態模式與多語言支持(圖六)
  圖4、多態類的結構圖。
  本章就需要用多態模式來實現資源對象,需要構造出能提供有限個實例,每個實例有各不相同的屬性(即Locale代碼)。
  有上限多態類
  一個實例數目有上限的多態類已經把實例的上限當作邏輯的一部份建造到了多態類的內部;這種多態模式叫做有上限多態模式。
  比如每一麻將牌局都需要兩個色子,因此色子就應當是雙態類。這里就以這個系統為例,說明多態模式的結構。
   Java模式設計之多態模式與多語言支持(圖七)
  圖5、色子的類圖。
  下面就是多態類Die(色子)的源代碼:
  package com.javapatterns.multilingual.dice;
  import java.util.Random;
  import java.util.Date;
  public class Die
  {
  PRivate static Die die1 = new Die();
  private static Die die2 = new Die();
  /**
  *  私有的構造子保證外界無法
  *  直接將此類實例化
  */
  private Die()
  {
  }
  /**
  *  工廠方法
  */
  public static Die getInstance(int whichOne)
  {
    if (whichOne == 1)
    {
      return die1;
    }
    else
    {
      return die2;
    }
  }
  /**
  *  擲色子,返還一個在1到6之間的
  *  隨機數。
  */
  public synchronized int dice()
  {
    Date d = new Date();
    Random r = new Random( d.getTime() );
    int value = r.nextInt();
    value = Math.abs(value);
    value = value % 6;
    value += 1;
    return value;
  }
  }
  代碼清單3、多態類的源代碼。
  在多態類Die中,使用了餓漢方式創建了兩個Die的實例。根據靜態工廠方法的參數,工廠方法返還兩個事例中的一個。Die對象的dice()方法代表擲色子,這個方法會返還一個在1到6之間的隨機數,相當于色子的點數。
  package com.javapatterns.multilingual.dice;
  public class Client
  {
  private static Die die1, die2;
  public static void main(String[] args)
  {
    die1 = Die.getInstance(1);
    die2 = Die.getInstance(2);
    die1.dice();
    die2.dice();
  }
  }
  代碼清單4、客戶端的源代碼。
  由于有上限的多態類對實例的數目有上限,因此有上限的多態類在這個上限等于1時,多態類就回到了單態類。因此多態類是單態類的推廣,而單態類是多態類的非凡情況。
  一個有上限的多態類可以使用靜態變量儲存所有的實例;非凡是在實例數目不多的時候,可以使用一個個的靜態變量儲存一個個的實例。在數目較多的時候,就需要使用靜態聚集儲存這些事例。
  無上限多態模式
  多態類的實例數目并不需要有上限[CAMP02];實例數目沒有上限的多態模式就叫做無上限多態模式。
  由于沒有上限的多態類對實例的數目是沒有限制的,因此雖然這種多態模式是單態模式的推廣,但是這種多態類并不一定能夠回到單態類。
  由于事先不知道要創建多少個實例,因此必然是使用聚集治理所有的實例。本章要討論的多語言支持方案就需要應用到多態模式,關于沒有上限的多態模式的實現可以參見下面的討論。
   Java模式設計之多態模式與多語言支持(圖八)
  圖6、沒有上限的多態模式(左)和有上限的多態模式(右)的類圖。其中N就是實例數目的上限。
  有狀態的和沒有狀態的多態類
  如同單態類可以分成有狀態的和沒有狀態的兩種一樣,多態類也可以分成有狀態的和沒有狀態的兩種。
  多態對象的狀態假如是可以在加載后改變的,那么這種多態對象叫做可變多態對象(Mutable Singleton);假如多態對象的狀態在加載后就不可以改變,那么這種多態對象叫做不變多態對象(Immutable Singleton)。顯然不變多態類的情形較為簡單,而可變單態類的情形較為復雜。
  假如一個系統是建立在諸如EJB和RMI等分散技術之上的,那么多態類有可能會出現數個實例;因此在這種情況下除非提供有效的協調機制,不然最好不要使用有狀態的和可變的單態類,以避免出現狀態不自恰的情況。讀者可以參考本書的“單態(Singleton)模式”一章中的相關討論。
  多語言項目的設計
  由于熟悉了多態模式,系統的設計實際上并不復雜。
  語言代碼
  下面就是幾個常見的語言代碼:
   Java模式設計之多態模式與多語言支持(圖九)
  地區代碼
  下面就是幾個常見的地區代碼:
   Java模式設計之多態模式與多語言支持(圖十)
  Locale代碼
  一個 Locale 代碼由語言代碼和地區代碼組合而成,比如:
   Java模式設計之多態模式與多語言支持(圖十)
  代碼清單3、Locale代碼、語言代碼和地區代碼。
  Resource文件及其命名規范
  一個Resource文件是一個簡單的文本文件。一個Resource文件的名字是由一個短文件名和文件的擴展名properties組成,而Resource文件的短文件名則是Java程序在調用此文件時使用的文件名。
  一個Resource文件和一個普通的properties文件并無本質區別,但Java語言對兩者的支持是有區別的。java.util.Properties類不支持多語言,而java.util.ResourceBundle類則支持多語言。
  當Locale代碼是en_US時,Resource文件的文件名應當是短文件名加上Locale代碼,就是en_US。當Locale代碼是zh_CH時,Resource文件的文件名應當是短文件名加上Locale代碼,就是zh_CH。
  怎樣使用Locale對象和ResourceBundle對象。
  那么怎樣使用 ResourceBundle 讀取一個Resource文件呢?下面就是一個例子:
  Locale locale = new Locale("fr","FR"); ResourceBundle res = ResourceBundle.getBundle("shortname",locale);
  代碼清單4、怎樣使用Locale對象和ResourceBundle對象。
  在上面的例子里面,res對象會加載一個名為shortname_fr_FR.propertie

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品日韩在线观看| 亚洲精品av在线| 91香蕉亚洲精品| 欧洲成人午夜免费大片| 国产精品日韩在线观看| 亚洲精品白浆高清久久久久久| 国产一区二区三区在线观看网站| 欧美日韩亚洲一区二| 日韩亚洲欧美中文在线| 亚洲国产另类久久精品| 欧美俄罗斯乱妇| 国产一区二区三区视频| 成人精品久久久| 91成人在线观看国产| 亚州精品天堂中文字幕| 亚洲日本aⅴ片在线观看香蕉| 亚洲大胆人体在线| 国产亚洲欧美一区| 亚洲肉体裸体xxxx137| 成人黄色片在线| 中文欧美日本在线资源| 另类图片亚洲另类| 亚洲国产日韩一区| 亚洲系列中文字幕| 中文字幕久热精品在线视频| 亚洲国产精品嫩草影院久久| 亚洲精选中文字幕| 国产精品丝袜白浆摸在线| 日韩av不卡在线| 欧美最猛性xxxx| 超碰97人人做人人爱少妇| 日av在线播放中文不卡| 日韩电影网在线| 26uuu亚洲伊人春色| 91精品国产高清自在线| 欧美激情在线观看| 国产成人在线一区二区| 亚洲欧洲日产国码av系列天堂| 亚洲精品www久久久久久广东| 精品视频久久久| 欧美俄罗斯性视频| 91日本在线观看| 中文字幕成人在线| 尤物精品国产第一福利三区| 午夜精品久久久久久99热| 日本不卡高字幕在线2019| 欧美精品激情在线观看| 国产精品久久在线观看| 亚洲最大成人在线| 国产成人a亚洲精品| 日韩亚洲成人av在线| 亚洲欧洲一区二区三区久久| 日韩欧美亚洲成人| 欧美激情精品久久久久久| 成人激情在线观看| 久久久99久久精品女同性| 中日韩美女免费视频网站在线观看| 国产一级揄自揄精品视频| 97香蕉超级碰碰久久免费的优势| 久久成人av网站| 色哟哟亚洲精品一区二区| 视频一区视频二区国产精品| 亚洲精品女av网站| 欧美电影免费观看高清完整| 88国产精品欧美一区二区三区| 亚洲欧美在线一区| 69**夜色精品国产69乱| 亚洲综合一区二区不卡| 懂色aⅴ精品一区二区三区蜜月| 国产免费一区二区三区在线观看| 精品久久久香蕉免费精品视频| 成人久久久久爱| 国产原创欧美精品| 欧美激情国产日韩精品一区18| 91热福利电影| 亚洲国产精品久久久久秋霞蜜臀| 国产精品视频资源| 欧美日韩国产中文精品字幕自在自线| 国产精品看片资源| 久久激情视频免费观看| 成人欧美一区二区三区黑人孕妇| 91精品久久久久久久久中文字幕| 中文字幕日韩在线播放| 欧美亚洲视频在线观看| 国产91精品久久久久| 国产美女久久精品香蕉69| 国产精品欧美日韩久久| 国产精选久久久久久| 亚洲一区二区自拍| 91久久嫩草影院一区二区| 81精品国产乱码久久久久久| 久久激情视频久久| 欧美黑人一级爽快片淫片高清| 亚洲欧美成人在线| 成人xvideos免费视频| 久久精彩免费视频| 久久视频在线播放| 日韩av电影手机在线观看| 国产精品99免视看9| 国产v综合v亚洲欧美久久| 一个人看的www久久| 中文字幕综合一区| 国产成人av在线播放| 亚洲一区二区三区四区在线播放| 欧美高清无遮挡| 91产国在线观看动作片喷水| 亚洲一级黄色片| 亚洲另类xxxx| 日韩在线观看免费高清| 亚洲91精品在线| 日本中文字幕久久看| 欧美精品在线播放| 91嫩草在线视频| 欧美乱大交xxxxx另类电影| 欧美—级a级欧美特级ar全黄| 日韩欧美国产激情| 日韩av在线网| 国产+人+亚洲| 久久精品久久精品亚洲人| 亚洲高清一二三区| 欧美日韩高清区| 久久91精品国产91久久久| 福利微拍一区二区| 日韩欧美亚洲国产一区| 中文字幕一区二区精品| 麻豆一区二区在线观看| 亚洲男人天堂久| 亚洲欧美成人一区二区在线电影| 欧美激情欧美狂野欧美精品| 日韩激情视频在线播放| 久久成人精品一区二区三区| 日本精品视频在线| 欧美最近摘花xxxx摘花| 色偷偷91综合久久噜噜| 日韩最新免费不卡| 亚洲精品小视频在线观看| 26uuu国产精品视频| 91香蕉国产在线观看| 亚洲欧美日韩综合| 国产精品h片在线播放| 欧美精品18videosex性欧美| 高清欧美性猛交xxxx黑人猛交| 国产亚洲人成a一在线v站| 亚洲色图13p| 久久久国产一区二区| 欧美电影在线观看网站| 久久视频在线播放| 国产美女直播视频一区| 亚洲一区二区精品| 97热精品视频官网| 在线播放国产一区二区三区| 久久久999精品视频| 国产精品扒开腿做爽爽爽男男| 欧美有码在线视频| 富二代精品短视频| 欧美精品成人91久久久久久久| 欧美性20hd另类| 国产香蕉精品视频一区二区三区| 国产精品海角社区在线观看| 色偷偷91综合久久噜噜| 亚洲欧美成人在线| 国产精品久久久久久久久久东京| 国产精品jizz在线观看麻豆| 97成人精品区在线播放|