欢迎来到天天文库
浏览记录
ID:32706256
大小:90.00 KB
页数:42页
时间:2019-02-14
《java模式设计之多态模式多语言支持》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、.Java模式设计之多态模式与多语言支持作为对象的创建模式,多态模式中的多态类可有多个实例;而且多态类必须自己创建、管理自己的实例,并向外界提供自己的实例。读者在阅读本文的时候,可以参考阅读笔者的《Java与模式》一书(刚由电子工业出版社出版)中的相关章节。 引言一个真实的项目 这是一个真实的、面向全球消费者的华尔街金融网站项目的一部份。按照项目计划书,这个网站系统是要由数据库驱动的,并且要支持十九种不同的语言;而且在将来支持更多的语言。消费者在登录到系统上时可以选择自己所需要的语言,系统则根据用户的选择将网站的静态文字和动态
2、文字全部转换为用户所选择的语言。 经过讨论,设计师们同意对静态文字和动态文字采取不同的解决方案:... 把所有的网页交给翻译公司对上面的静态文字进行翻译,而网页上面的动态内容则需要程序解决。 在进行了研究后,设计师们发现,他们需要解决的动态文字的“翻译”问题,实际上是将数据库中的一些静态或者半静态的数据进行“翻译”。下面就是一个典型的数据表:货币代码货币名称货币尾数USDAmerica(UnitedStatesofAmerica),Dollars2...CNYChina,YuanRenminbi2EURFrance,Euro
3、2JPYJapan,Yen0 代码清单1、为英文用户的准备的货币列表。真的不掉线吗??、????????????... 货币代码永远是上面所看到的英文代码,但是货币名称应当根据用户所选择的语言不同而不同。比如对中文读者就应当翻译成为下面的表:货币代码货币名称货币尾数USD美国(美利坚合众国),美元2CNY中国,人民币元2...EUR法国,欧元2JPY日本,日元0 代码清单2、为中文用户准备的货币列表。 这样的表会在网页上作为下拉菜单出现,用户看到的是货币名称,而系统内部使用的是货币代码。 国际化解决方案... 这样的问
4、题就是国际化的问题,所谓国际化就是Internationalization,简称作i18n(请参见本章最后的问答题)。 设计师所采取的实际方案是分层方案,也就是MVC模式。MVC模式将系统分为三个层次,也就是模型(Model)、视图(View)、控制器(Control)三个部份。国际化是视图部份的问题,因此应当在视图部份得到解决。 图1、MVC模式的示意图。真的不掉线吗??、???????????? 换言之,系统的内核可以是纯英文的;在内核外部增加一个壳层负责语言翻译工作。请见下面的概念图:... 图2、英文内核和
5、翻译壳层的概念图。 所谓内核就是系统的模型,而翻译壳层便是视图的一部份。对多语言的支持属于视图功能,因此不应当在内核解决,而应当在视图解决。这就是设计师们达成的总体方案。 多态模式多态模式的特点 所谓的多态模式(MultitonPattern),实际上就是单态模式的自然推广。作为对象的创建模式,多态模式或多态类有以下的特点: 多态类可有多个实例;多态类必须自己创建、管理自己的实例,并向外界提供自己的实例。... 单态类一般情况下最多只可以有一个实例,请见下面的结构图: 图3、单态类的结构图。 但是单态模式的精神是
6、允许有限个实例,并不是仅允许一个实例;这种最多只允许有限多个实例,并向整个JVM提供自己实例的类叫做多态类(Multiton),这种模式叫做多态模式(MultitonPattern),请参见下面的结构图。 图4、多态类的结构图。真的不掉线吗??、????????????... 本章就需要用多态模式来实现资源对象,需要构造出能提供有限个实例,每个实例有各不相同的属性(即Locale代码)。 有上限多态类 一个实例数目有上限的多态类已经把实例的上限当作逻辑的一部份建造到了多态类的内部;这种多态模式叫做有上限多态模式。 比
7、如每一麻将牌局都需要两个色子,因此色子就应当是双态类。这里就以这个系统为例,说明多态模式的结构。 图5、色子的类图。 下面就是多态类Die(色子)的源代码:...packagecom.javapatterns.multilingual.dice;importjava.util.Random;importjava.util.Date;publicclassDie{ privatestaticDiedie1=newDie(); privatestaticDiedie2=newDie(); /** * 私有的构造子保证外
8、界无法 * 直接将此类实例化真的不掉线吗??、???????????? */ privateDie() { } /** * 工厂方法 */ publicstaticDiegetInstance(intwhichOne) {
此文档下载收益归作者所有