登陆注册
8183300000095

第95章 10 Flyweight模式在XML等数据源中应用

大B:“我们前面已经提到,当大量从数据源中读取字符串,其中肯定有重复的,那么我们使用Flyweight模式可以提高效率,以唱片CD为例,在一个XML文件中,存放了多个CD的资料。”

每个CD有三个字段:

1、出片日期(year)

2、歌唱者姓名等信息(artist)

3、唱片曲目(title)

其中,歌唱者姓名有可能重复,也就是说,可能有同一个演唱者的多个不同时期不同曲目的CD。我们将‘歌唱者姓名’作为可共享的ConcreteFlyweight。其他两个字段作为UnsharedConcreteFlyweight。

首先看看数据源XML文件的内容:

《xml version=“1.0”?》

《collection》

《cd》

《title》Another Green World《/title》

《year》1978《/year》

《artist》Eno,Brian《/artist》

《/cd》

《cd》

《title》Greatest Hits《/title》

《year》1950《/year》

《artist》Holiday,Billie《/artist》

《/cd》

《cd》

《title》Taking Tiger Mountain(by strategy)《/title》

《year》1977《/year》

《artist》Eno,Brian《/artist》

《/cd》

……

《/collection》

虽然上面举例CD只有3张,CD可看成是大量重复的小类,因为其中成份只有三个字段,而且有重复的(歌唱者姓名)。

CD就是类似上面接口Flyweight:

public class CD{

private String title;

private int year;

private Artist artist;

public String getTitle(){return title;}

public int getYear(){return year;}

public Artist getArtist(){return artist;}

public void setTitle(String t){title=t;}

public void setYear(int y){year=y;}

public void setArtist(Artist a){artist=a;}

}

将“歌唱者姓名”作为可共享的ConcreteFlyweight:

public class Artist{

//内部状态

private String name;

//note that Artist is immutable。

String getName(){return name;}

Artist(String n){

name=n;

}

}

再看看Flyweight factory,专门用来制造上面的可共享的ConcreteFlyweight:Artist

public class ArtistFactory{

Hashtable pool=new Hashtable();

Artist getArtist(String key){

Artist result;

result=(Artist)pool。get(key);

////产生新的。

if(result……null){

result=new Artist(key);

pool。put(key,result);

}

return result;

}

}

当你有几千张甚至更多CD时,Flyweight模式将节省更多空间,共享的flyweight越多,空间节省也就越大。

给个例子,coffee商店

package FlyWeight。coffeeshop;

public class Table{

private int number;

public int getNumber(){

return number;

}

public void setNumber(int number){

this。number=number;

}

public Table(int number){

super();

//TODO Auto-generated constructor stub

this。number=number;

}

}

package FlyWeight。coffeeshop;

public abstract class Order{?

public abstract void serve(Table table);

public abstract String getFlavor();

}

package FlyWeight。coffeeshop;

public class Flavor extends Order{

private String flavor;

public Flavor(String flavor){

super();

//TODO Auto-generated constructor stub

this。flavor=flavor;

}

public String getFlavor(){

return flavor;

}

public void setFlavor(String flavor){

this。flavor=flavor;

}

public void serve(Table table){

System。out。println(“Serving table” table。getNumber() “with flavor” flavor);

}

}

package FlyWeight。coffeeshop;

public class FlavorFactory{

private Order[]flavors=new Flavor[10];

private int ordersMade=0;//已经处理好的订单数

private int totalFlavors=0;//已购买的coffee风味种类数

public Order getOrder(String flavorToGet){

if(ordersMade>;0){

for(int i=0;i<ordersmade;i ){

if(flavorToGet。equalsIgnoreCase(flavors[i]。getFlavor()))

return flavors[i];

}

}

flavors[ordersMade]=new Flavor(flavorToGet);

totalFlavors ;

return flavors[ordersMade ];

}

public int getTotalFlavorsMade(){

return totalFlavors;

}

}

package FlyWeight。coffeeshop;

public class Client{

private static Order[]flavors=new Flavor[100];

private static int ordersMade=0;

private static FlavorFactory flavorFactory;

private static void takeOrders(String aFlavor){

flavors[ordersMade ]=flavorFactory。getOrder(aFlavor);

}

public static void main(String[]args){

flavorFactory=new FlavorFactory();

takeOrders(“Black Coffee”);

takeOrders(“Capucino”);

takeOrders(“Espresso”);

takeOrders(“Espresso”);

takeOrders(“Capucino”);

takeOrders(“Capucino”);

takeOrders(“Black Coffee”);

takeOrders(“Espresso”);

takeOrders(“Capucino”);

takeOrders(“Black Coffee”);

takeOrders(“Espresso”)。

for(int i=0;i<ordersmade;i ){

flavors[i]。serve(new Table(i));

}

System。out。println(\nTotal Flavor objrcts made:

flavorFactory。getTotalFlavorsMade());

}

}

//――

运行结果:

Serving table 0 with flavor Black Coffee

Serving table 1 with flavor Capucino

Serving table 2 with flavor Espresso

Serving table 3 with flavor Espresso

Serving table 4 with flavor Capucino

Serving table 5 with flavor Capucino

Serving table 6 with flavor Black Coffee

Serving table 7 with flavor Espresso

Serving table 8 with flavor Capucino

Serving table 9 with flavor Black Coffee

Serving table 10 with flavor Espresso

</ordersmade;i ){

</ordersmade;i ){

同类推荐
  • 都是网络惹的祸

    都是网络惹的祸

    本书分网络游戏、网络聊天、网络隐私、网络网吧安全、网络文化、网络语言、网络犯罪、网络陷阱等栏目,从不同的视角探讨了在当今社会的网络现象。
  • 云计算和现代远程教育

    云计算和现代远程教育

    本书介绍了云计算知识、云计算的特性、云计算技术、云计算中的访问云、云计算中的云存储、云计算在远程教育中的应用等内容。
  • 互联网创业前奏曲(第二部)——网站运营之人性、策略与实战

    互联网创业前奏曲(第二部)——网站运营之人性、策略与实战

    本书是《互联网创业前奏曲》系列的第二本书,是作者多年互联网实践经验和业界观察的总结,是国内罕有的关于互联网网站运营和用户心理结合的书籍,用通俗的语言阐述互联网运营背后的人性驱动。你想互联网创业吗?你是否在为找不到好的互联网运营策略和方法而发愁?你非常想了解互联网行业?你是否在为自己不了解互联网运营而苦恼?本书针对这些问题列举了很多互联网运营的案例,帮你制定运营策略,更好的修炼和提升运营功力。
  • 办公设备使用与维护

    办公设备使用与维护

    信息技术的发展正前所未有地改变着人类生活的每一个层面,以信息化、全球化和高科技为特征的新经济浪潮滚滚而来,机遇与挑战并存。办公自动化是信息化时代最重要的标志之一,办公要实现自动化,当然离不开办公设备。
  • 领导干部信息化基础

    领导干部信息化基础

    本书共分6章,分别介绍了计算机网络综述;信息化的三个主要领域,即电子政务(政府信息化)、企业信息化和电子商务;PowerPoint2000中文演示文稿等内容。
热门推荐
  • 我最想要的智慧成功书

    我最想要的智慧成功书

    希拉里是世界上少数极为成功的女人之一。从州长夫人到第一夫人,到国会参议员,到总统候选人,到国务卿,她走过的成功之路给予女人们很多启示。本书从塑造形象、调节心态、经营婚姻、成就事业、重视社交、珍惜亲情等方面,全面传达了希拉里用自身经历告诉我们的智慧成功箴言,告诉女人们如何用希拉里的方式去生活、走向成功。通过阅读此书,你会找到一条成为魅力与智慧并举、勇敢和幸运同兼的成功女性的捷径。
  • 警痕星凌

    警痕星凌

    她与他本来相互喜欢,却在还未表明心意时就因一场来不及说清的误会而分离。当8年后意外的重逢他们之间又会发生怎样的故事呢?
  • 至尊神葫

    至尊神葫

    此神秘红色葫芦不知由何物炼制而成,似木非木、似金非金、似石非石。神葫当中有一种神奇药液,不但能够修复身体,还能够修复灵魂、金丹、元婴,甚至还能够修复…
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 吞世魔神

    吞世魔神

    叶尘是站在圣武大陆巅峰的圣尊,可在渡仙劫,开仙门的最关键时刻,要成就仙人时,却遭到了无情的背叛,不慎陨落,被一缕白光带走,转世重生,修炼吞天诀,开始新的历程,前世错过,今世补,了无遗憾升仙界。
  • 一世独宠:专属太子妃

    一世独宠:专属太子妃

    【完结】她,现代金牌寻宝专家,睿智冷静,温婉端庄。他,万人追捧楚国太子,温润如玉,腹黑如墨。他暗恋她五年,默默看她与青梅竹马殉情未遂,终以三十二抬大轿娶她入宫,却不知娶的是穿越而来的冒牌货!大婚之日,分房而睡,霸占他席位的,竟是一只色眯眯的灵狐?相敬如宾多少日,对战情敌几多时。他以一生独宠,换她一世倾心。一声怒喝,赶跑她的美男粉丝团:妖孽仙尊、魔宫少主、冷面富少……他大灰狼变小白兔,卖萌装可怜,“雅儿,为夫昨晚没吃饱,快让我再吃一口……”【静曼朵朵】书友QQ群号:239510544。新书古言穿越言情《毒妃来袭:邪帝,一边去》欢迎围观!
  • 千屈夭夭

    千屈夭夭

    我抬头瞥了一眼,定了属性:出场晚,长相一般,身材嘛,嗯嗯看起来还可以,衣着打扮一般,没有显示低调的斗笠,没有拉风的披风,手里没有拿刀啊剑啊等加分道具,于是初步断定,此人为路人丙。“有心的地方,便是风景;风景在的地方,最普通的话也便成了诗。”你的心在这里吗?”大多说自己不相信爱情的人骨子里都是渴望爱情的,就像自欺欺人的等待童话里的对方为自己证明一样。这是一个证明爱情存在的故事,送给相信与不相信的人。
  • 战灵苍穹

    战灵苍穹

    盘古分三界,洪荒生战灵,小城之中的魏骋,能否打拼出自己的一片天地?
  • 最后的遇见,才完美

    最后的遇见,才完美

    我一生中,真真正正爱过两个人。两个人的爱,两种不同的方式。一种疯狂的爱,一种温柔的爱。一个教会了我如何放弃爱,一个教会我如何懂得爱。有人曾问我:“放弃一个你很喜欢的人是什么感觉?”直到遇见对的那个人过后,我这样回答:“你拔过牙吗?”