




已阅读5页,还剩88页未读, 继续免费阅读
(计算机应用技术专业论文)用java泛型实现设计模式.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要 摘要 设计模式是通过总结无数具体实践经验,由软件业众多精英提出的 设计过程中的一种指导思想。设计模式是经过时间和应用领域考验过的 对一些问题的解决方案,那些问题已经被经验丰富的设计师、开发者和 语言专家所解决。j d k l 5 正式纳入泛型,将其作为内置特性。泛型解决 了j a v a 编程中最令人头疼的问题之一一当对象引用了一个不同的数据类 型时所带来的数据类型转换问题。 本文首先对泛型和非泛型做出了比较,并对j a v a 泛型的语法做了一 定程度的阐述。然后以j a v a 泛型作为开发工具,将g o f 的2 3 个设计模 式作为实现的目标,分析了各个设计模式泛化的可能性,并对能够泛化 的模式给出了其泛化实现。在编写代码的过程中我们发现,除了b 瑚g e 模式外,其它的2 2 个模式基木都能被泛化。对各个设计模式泛化前后代 码进行比较,从耦合性、可重用性等方面进行了定量分析,我们可以发 现创建型模式和行为型模式中的大部分泛化后,模式的耦合性降低,而 结构型模式泛化后性能耦合性没有太大变化。 本课题的意义在于,用j a v a 泛型实现了设计模式,并把它与用j a v a 实现的设计模式进行了比较,分析了各自的优缺点。对基于模式的软件 开发具有指导作用。 关键词:设计模式,j a v a 泛型,泛化 武汉工程大学硕士学位论文 一一 a b s t ra c t d e s i g np a t t e mi sak i i l do fg u i d a n c ei d e am a ti sm es u m m a r yo fm u c h p r a c t i c ee x p e r i e n c e 粕dp 托s e l l t e db ym 锄ye 坤e f t s i i ls o f t w a r ef i e l d ni s t e s t e d 断o u 曲t i i i l ea i l d 印p l i c a t i o nf i e l d ,a n ds o l 妇gp f o j e c t t os o m e p r o b l e m sw l l i c ha r es o l v e db ys e a s o n e dd e s i g n e r 、d e v e l o p c ra n dl 证g l l i s t , j d k l 5t a k c si i lg e n e r i ct y p ea si t s 缸e r i o rc h a r a c t c r i s t i cf b r m a l l y g e n c r i c t y p es o l v e s 蚰eo fm em o s th e a d a c h yp r o b l e l i l s i i lj a v ap r o 伊雏n i l l g d a t e - t y p ec o n v e r s i o nb r o u g h tw h e no b j e c tr e f e r st oa d i a e r e n td a t e t ) r p e a cm eb e g i i l l l i n g ,m i sp 印e rc o m p a r c sg e n e r i ct y p ew i t hn o n g e n e r i c t y p e ,e l a b o r a l i n gs 珊a ) 【o fj a v ag e n e r i ct y p et oac e r t a i l le ) ( t 肌t t h e ni t 饭k e s j a v ag e n c r i ct y p ea sd e v e l 叩i l l gt o o ia n d2 3d e s i 印p a t t e m so fg o fa s i l n p i e m e n t a t i o nt a r g e t ,锄a l y z i n gg e n e r i cp o s 8 i b i l 毋o fe a c hp a 仳锄锄d p r e s e n t i l l gg 谢c 娜ei m p l e m e n t a t i o no ft l l o s ew h o c a nb eg c i l c r i c w h e n c o d i l l g ,w ef m dm a to m e r2 2d e s i g i lp a 舭m sc 锄b eg e n e r i cb 骶i c a l 】ye x c e p t b r i d g ep a t t e m c o m p a r i l l gc o d e so fe a c hp a 仕咖b e f b r ea n dm e rg e n 盯i c , a 1 1 a 1 ) ,z i l l gq u a l l t i t a t i v e l yf b o mc o 叩l m ga i l dr e u s a b i l i t y ,w ec a l l 盎dt l l a t c o u p l i l l go fm o s tc r e a t i o np a 仕e m 锄db e h a v i o rp 砒t e md 。c r e 2 l s ea f t c rg e i l e r i c , w h 丑es t r u c t l l i 。ep a 壮e mh a v en oo b v i o u sc h 觚g e t h i sp r o j e c ta i n l st oi m p l 锄e n t i n gd e s i 印p a t t e m 谢mj a v ag e n e r i c 啪e a i l dc o m p 鲫【n gi tw i 血m eo n ci i n p l e m c n t e db yj a v a ,锄a l y z i i l ga d v 锄t a g e s 锄dd i s a d v a n t a g e so fm e i re a c h i ( e y w o r d :d e s i 伊p a 仕e n l ,j a v ag e n 舐ct y p e ,g e n e r i c 独创性声明 本人声明所呈交的学位论文是我个人在导烬指导下进行的研究 工作及取得的研究成果。尽我所知,除文中已经标明弓l 用的内容外, 本论文不包含任何其他个人或集体己经发表或撰写过的研究成果。对 本文的研究做出贡献的个人和集体,均已在文中以明确方式标明。本 人完全意识到本声明的法律结果由本人承担。 学位论文作者签名:冷婕 妒6 年s 月苫莎日 学位论文版权使用授权书 本学位论文作者完全了解我校有关保留、使用学位论文的规定, 即:我校有权保留并向国家有关部门或机构送交论文的复印件和电子 版,允许论文被查阅。本人授权武汉工程大学研究生处可以将本学位 论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩 印或扫撼等复制手段保存和汇编本学位论文。 保密0 ,在年解密后适用本授权书。 本论文耩于 不保密d 。 ( 请在以上方框肉打“”) 学位论文作者签名:森炙捷 k 加年歹月1 莎日 指导教师签名:俪式i 耐年厂月p 瞻 第1 章绪论 1 1 泛型概述 第1 章绪论 泛型( g e n e r i c s ) 概念始于d o u gm c i l r o y 于1 9 6 8 年发表的一篇著名 论文m a s sp r o d u c e ds o 胁a r ec o n l p o n e n t s ”,那篇论文提出了“r c u s a b l e c o m p o n 础”( 可复用软体组件,又称为软体积木或软体i c ) 的远景。 过去数十年来,泛型技术比较属于研究单位中的骄客,实做出来且 被广泛运用的产品极少。虽然a d a ,a l g o l 6 8 ,e i 蹦,c + + 等语言都支持泛 型相关语法,但是直到c + + 不断加强t e 1 p l a t e 机制,并将a l e x a n d c r s 自印a n o v 创作的s t l 纳入标准,泛型技术才终于在标准资料结构和标准 演算泫领域中有一套可被大众运用的实作品出现,向现实迈进一大步。 1 9 9 8 年,国际c + + 标准正式通过,c + + 提供了_ 种功能强大的抽象 方法:面向埘象编程和泛型编程。前者大家一定很熟悉了,但后者( g e n 嘶c p r o 黟a n l i n i n g ) ,有的人可能不太熟悉,但是提到s t l ,大家一定有所耳闻。 s t l ( s t a l l d a r d t e m p l a t el 而r 卸吼标准模板库) 其实就是泛型编程的实现品 【2 1 1 2j a 、,a 泛型发展 s 眦j d k 的泛型发展要从1 3 版本说起,他配合g j ,正式进入泛型 殿堂。g j 是“g e n e r i cj a v a ”的缩写,是一个支援泛型的j a v a 编译器补充 武汉工程大学硕士学位论文 件,是j a v a 泛犁技术的先驱。随后,泛犁议题正式成为j s r 鼻1 4 ,其技术 基础便是源自g j 。j d k l 4 搭配j s r l 4 提供的外挂附件,使泛型技术在 j a v a 世界成为众所瞩目的焦点。 2 0 0 4 年夏天,s u n 公司发布了j a v a 编程语言的重大修改版。该版本 代号取名为“t i g e r ”,官方名称为j d k l 5 。j d k l 5 相对于j d k l 3 罕j d k l 4 之问变化幅度大很多,它将在运行时性能( 姗t i n l ep e f f o n n 锄c e ) 、可扩缩 性( s c a l a b i l i 叻、易管理性( m 蹰a g e a b i l i 劝和监控( m o 砸t _ 咀g ) 方面有较大加 强:此外,还增加了许多激动人心的新的语言特性。泛型就是其中之一。 j d k l 5 内建泛型特征,不仅编译器不再需要任何外力( 外挂附件) 的帮 助,整个j a v a 标准程式库也被翻新,许多角落针对泛型做了改写1 3 j 。 1 3 设计模式概述 近年来,软件开发,特别是软件设计中出现了两种相对立的趋势:一 方面,数据量和软件规模的爆炸性增长,使得软件设计的难度越来越大, 软件设计者在日益重视软件工程技术的普遍应用的同时,对软件工程从 理论上提出了更高的要求。另一方面,全球性的竞争要求不断缩短开发 时间、提高软件开发生产率,同时还要保证设计的正确性和可靠性。这 两种趋势导致了对如何尽可能地重用已验证的软件设计的研究。正是在 此前景下,设计模式作为一种崭新的概念被引人软件工程领域。 设计模式是经过时间和虑用领域考验过的对一些问题的解决方案, 那些问题已经被经验丰富的设计师、开发者和语言专家所解决。设计模 第l 章绪论 式使人们可以更加简单方便地复用成功的设计和体系结构。同时,将已 证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思 路。 设计模式并不是具体的“技术”,它讲述的是思想,通过提供一个 框架,设计模式可以解决应用开发中的许多问题。 各个模式的产生都是遵循下面炳种基本准则: 1 能组合不继承 2 将对象的抽象与实现分离 总之,应用设计模式的目的是要降低系统内各对象间的依赖关系, 使它们处于松耦合状态。这样才可以提高对象的可扩展性和可复用性1 4 】。 1 4 设计模式发展 模式的研究起源于建筑工程设计c 城s t o p h e r e x 髓d e f 大师的关于 城市规划和建筑设计的著作,他认为:每一个模式描述了一个在我们周 围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能 次又一次地使用该方案而不必做重复劳动。尽管砧e x 觚d e r 所指的是城 市和建筑模式,但他的思想也同样适用于面向对象设计模式【5 1 。 设计模式在软件设计行业中的起源可以追溯到1 9 8 7 年。那时, w a r d c u n n i n 曲锄和k e mb e c k 在一起用s m a l l t a 墩做设计用户界面的工 作。他们决定使用甜e x 飙d e r 的理论发展一个有五个模式的语言来指导 s m a m a 墩的新手,因此他们写成了一篇“u s :i i l gp a t t e ml a n g u a g e s 蠡w 武汉工程大学硕士学位论文 0 巧e c t o r i e m e dp r o 黟a m s ( 使用模式语言做面向对象的程序) ”的沦文( 发 表于o o p s l a 8 7 诹o r l a n d o ) 。 在那以后不久,j i i nc o p l i e n 开始搜集c + + 语言的成例( i d i o m s ) 。成 例是模式的一种,这些成例发表在1 9 9 1 年出版的a d v a n c c dc + + p r o 伊锄珊【i n gs t y l e sa n di d i o m s ( 高级c + + 编裎风格和成例) 一书中1 6 】。 从1 9 9 0 年到1 9 9 2 年,【g o f 9 5 】的四位作者开始搜集模式的工作。关 于模式的讨论和工作会议则一再举行。 在1 9 9 3 年8 月,k e n t b e c k 和g r a d y b o o c h 主持了在科罗拉多的山区 度假村召开的第一次关于模式的会议,模式研究的主要人物都参加了这 个会议,包括j i l nc o l i e n ,d o u gl e a ,d e s m o n dd s o u z e ,n o n nk e r 札 w o l 龟姐gp r e e 等。 在那以后不久, g o f 9 5 】四位作者的d e s i 驴pa _ m s 一书发表了。 此书发表之后,参加模式研究的人数呈爆炸性增长,被确定为模式 结构的数日也呈爆炸性增长。编程模式语言大会( p a t t e ml a i l g u a g c so f p f o 笋珊疵g ,或者p l o p ) 每年一次定期在美国举行,大会的论文也汇编 成书,公开发表为口p l o p 9 5 】,【p l o p 9 6 】,【p l o p 9 8 】,p l o p 9 9 川。 模式也不断地被应用到软件工程的各个方面。在诸如开发组织,软 件处理,项目配置管理等方面,都可以看到模式的影子,但至今得到了 最深研究的仍是设讣模式和代码模式。 在( d e s i 印p a t t e m ) 一书中共包含了2 3 个模式,依据其日的可分为 创建型( c r e a t i o n a l ) 、结构型( s n u c “h 谢) 、或行为型( b e h a v i o r a l ) 三种。 第l 章绪论 创建型模式与对象的创建有关:结构型模式处理类或对象的组合;行为 型模式对类或对象怎样交互和怎样分配职责进行描述嘲。 1 5 论文研究背景 设计模式是前人软件设计经验的总结,智慧的结晶,是一种指导。 存一个良好的指导下,有助于软件设计者完成任务,做出一个优良的设 计方案,达到事半功倍的效果。我们需要借鉴大师的经验,站在巨人的 肩膀上才能够更好的前行。利用设计模式能让我们学习和开发软件时少 走弯路,使得开发出来的软件从一开始就是严密的,也能更加s c a l a b l e 和 搠l s a b l e ,从而可以提供更强的可维护性、更短的开发生命周期。研究模式 还可以让我们开发软件更流畅、更模块化,减少耦合。 设计模式描述的是面向对象设计,但它们都基于实际的解决方案, 这些方案的实现语言可以是s m a l l t a l k 和c + + 等一些主流面向对象编程语 言,而不是过程语言( p 鹪c a l 、c 、a d a ) 或更具动态特性的面向对象 语言。程序设计语言的选择非常重要,因为模式影响着系统的结构,反 之,系统结构也影响着模式的实现。 到目前,这些主流的面向对象编程语言如:c + + 、j a 、,a 、a o p 等都 实现了对这些设计模式的描述。如上所述,语言不同,实现模式的效率, 可复用性,模块性等也有所不同。但综合来说,用这些传统的面向对象 的设计语言来实现设计模式有共同的弊端。首先,冈为模式的实现是和 使用的实例交织在一起的,这就会导致模式自身的代码和具体的实例的 武汉工程大学硕士学位论文 代码,对象模犁混合在一起,很难区分开。向系统中添加或从系统中移 除一个模式通常是很难实现的可逆操作。从而,虽然设计模式是可复用 的,但它的实现通常不行。其次,由于模式代码和其它代码分散、混合 在一起,则当系统中使用多个模式,特别是如果类包含在多个模式中时, 要追踪一个设计模式中特定的实例就变得很困难。再次,一咎模式在自 身的解决方案中会使用其它的模式,这样的模式的组合会引起类之问的 相互依赖,导致分析使用包括相同类的多个模式的系统变得困难嗍。 下面我们就以面向对象语言中的a s p e c u 为例,来分析用其实现2 3 个设计模式的优缺点。在j a nh a n i l e m a n n 和g r e g o rk i c z a l e s 所写的 “d e s i 驴p a 仳咖i i n p l e m e m a t i o ni 1 1j a v am da s p e c t j ”一文中用a s p e c t j 实 现了g o f 书中2 3 个模式,其中的1 7 个模式在代码的独立性,可复用性 等方面得到了提高。特别是在角色和参与者类之间有横切点结构时,提 高更明显。同时我们也发现用a s p e c 实现设计模式存在问题和局限性。 例如:在c o n l p o s i t e 模式中,为实现可复用性而使开销增大;c o n m a i l d , t e 唧l a t em e t l l o d 模式的适用性受到限制。这些缺点源自a s p e c t j 自身, 归纳如下:( 1 ) 难于获得足够的连接点将所需要的额外行为织入程序巾; ( 2 ) 难于在适当的时候取得显示a s p e c t 所需要信息的连接点;( 3 ) 没 有封装,a s p e c t 不能确定对象的数量【9 j 。 面对上述这些弊端,我们自然就想到有什么方法能解决这些问题 呢? 自然而然的,“泛型”跃入我们的眼帘。泛型编程与面向对象编程不 同,它不要求你通过额外的问接层来调用函数,它让你编写完全一般化 第l 章绪论 并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同。 它将算法和数据类型分开,不与任何特定数据结构或对象类型系在一起 【1 0 】。 目前,已有论文对设计模式在c + + 泛型中的实现展开研究,但用j a v a 泛型来实现还鲜有人涉足。早期j d k 需要和外挂附件相结合来实现泛型, 在2 0 0 4 年,s l l l l 公司推出了j d k l 5 ( t i g e r ) 才将泛型纳入其中。尽管 j a v a 泛型的语法是模仿c + + 模板的语法,但是j a v a 语法更易于理解。另 外,模板和泛型的执行过程并不相同。j a v a 保留了s a f e 类型,而且支持 泛型时,j a v a 并不暴露源代码。也就是说,j a v a 增强了泛型编程的威力, 而并没有出现其它应用语言所出现的诸多闯剧1 1 】【1 2 】。 1 6 论文研究目标 本课题主要研究的内容是用j a 、,a 泛型分别实现如下设计模式如表 1 1 所示,工具采用j d l ( 1 5 研究的内容涉及以下几个方面: 1 、熟悉j d k l 5 。 s 眦公司在2 0 0 4 年推出了j a v a 编程语言的重大修改版j d k l 5 ,版木 代号为“t i g e r ”。j d k l 5 相对于以前的版本在运行时性能、可扩缩性、 易管理性和监控性方面有较大加强此外,还增强了许多激动人心的新的 语言特性。要在原有知识的基础上,探索j d k l 5 的这些新特性。 武汉工程大学硕士学位论文 表1 1g o f 的2 3 个设讣模式 创建型结构型行为型 2 、用j a v a 泛型实现2 3 个设计模式。 用j a v a 泛型实现这2 3 个设计模式,其中实现后代码的可重用性 是重点。分析哪些模式可以用泛型实现,哪些不行。 3 、与用其它方法实现的代码进行比较。 - 8 第l 章绪论 与用j a v a ,c + + s t l 编写的模式进行比较,分析各自的优缺点。 4 、定量分析j a v a 泛型实现的设计模式和用其它代码( 以j a v a 为 例) 实现的设计模式。 分别用以下六个度量标准: 1 ) w b i g h t e dm e m o d sp e rc l a s s ( w m c ) 2 ) d e p lo fh 】l l c r i t 锄c et r e e ( d i d 3 )n 啪b e ro fc l l i l d r e n ( n o c ) 4 ) c o u p l i n gb e t w e e n0 b j e c tc l 嬲s e s ( c b 0 ) 5 ) r e s p o n s ef o rac l a s s c ) 6 )l a c ko fc o h e s i o ni i lm e t l l o d s ( l c o m ) 武汉工程大学硕士学位论文 2 1 泛型编程 第2 章j a v a 泛型与设计模式 泛型又称为“参数化类型( p a r 锄e t 舒z e dt y p e s ) ”,或所谓“参数式的 多态( p a r 咖e 打i cp o l y m o r p h i s m ) ”。主要是一种类型代换( 母p es u b s t i t u t i ) 概念,是和继承( n h 硎t 锄c e ) 不同而互补的一种组件复用机制。泛型是 指具有在多种数据类型上皆可操作的含意,与模板有些相似,专注于将 类型抽象化,形成功能需求方面的一个精细集合,并利用这些需求来实 现算、法,相同的算法可以运用于广泛的类型集中。这解决了最另人头疼 的一个问题一当对象引用了一个不同的数据类型时所带来的数据类型转 换问题1 3 j 。 2 1 1 泛型编程简介 泛型编程是一种基于发现高效算法的最抽象表示的编程方法。就是 说,以算法为起点并且寻找能使其工作并且有效率工作的最一般的必要 条件。令人惊讶的是,大多数不同的算法都需要相同的必要条件集,并 日这些必要条件有多种不同的实现方式。类似的事实存数学里也可以看 到,大多数不同的定理都依赖于同一套公理并且对于同样的公理有多种 不同的模型州i 1 5 j 。 泛犁编程( g c n 丽cp m 酣珈m m g ,以下盲接以g p 称呼) 是一种全新 的程序设计思想。和0 0 ,0 b ,p 0 这些为人所熟知的程序设计想法不同 第2 章j a v a 泛型与设计模式 的是,g p 抽象度更高,基于g p 设计的组件之间耦合度底,没有继承关 系,所以其组件间的交互性和扩展性都非常高。 泛型设计的根本思想就是想把算法和其作用的数据结构分离,也就 是说,我们设计算法的时候并不去考虑我们设计的算法将作用于何种数 据结构之上。泛型设计的理想状态是一个查找算法将可以作用于数组, 链表,树,图等各种数据结构之上,变成一个通用的,泛型的算法。这 样的理想是很诱惑人的。 泛型编程带来的是前所未有的弹性以及不会损失效率的抽象性,g p 和0 0 不同,它不要求你通过额外的间接层来调用函数,它让你撰写完 全一般化并可重复使用的算法,其效率与针对特定数据结构而设计的算 法旗鼓相当。我们大家都知道数据结构可以用用户定义类型来表示,而 模板技术就是以类型作为参数,那么我可以想象利用模板技术可以实现 我们开始的g p 思想,即一个模板函数可以对于各种传递进来的类型起作 用,而这些类型就可以是我们定义的各种数据结构【1 0 1 。 泛型算法抽离于特定类型和特定数据结构之外,使得其适应与尽可 能的一般化类型,算法本身只是为了实现算法其需要表达的逻辑本质而 不去被为各种数据结构的实现细节所干扰。 2 1 2 泛型与非泛型 泛型比非泛型具有下面两个优点: 1 、更加安全 武汉工程大学硕士学位论文 在非泛犁编程中,类型转换在运行时是不安全的。使用泛犁编程将 可以减少不必要的类型转换,从而提高安全性。 2 、效率更高 在非泛型编程中,将简单类型传递时会引起b 嘣曲g 和u n b o x i l l g 操 作,这两个过程都是具有很大开销的。使用泛型编程就不必进行这两个 操作。 2 2 设计模式研究 模式依据其目的可分为创建型( c r e 撕o n a l ) 、结构型( s 缸u c t u r a l ) 、或 行为型( b e h a “0 r a l ) 三种。创建型模式与对象的创建有关;结构型模式处 理类或对象的组合;行为型模式对类或对象怎样交互和怎样分配职责进 行描述。 2 2 1 创建型( c r e a t i o n 村) a b s t 愧c tf a c t o r y :提供一个创建一系列卡h 关或丰h 互依赖对象的接口, 而无需指定它们具体的类。 b u 湘e r :将一个复杂对象的构建与它的表示分离,使得同样的构建 过程可以创建不同的表示。 f a c t o r ym e 伽o d :定义一个用于创建对象的接口,让子类决定将哪 一个类实例化。f a c t o 珂m e m o d 使一个类的实例化延迟到其子类。 p r o t o 够p e :用原型实例指定创建对象的种类,并且通过拷贝这个原 箱2 章j a v a 泛型与设计模式 型来创建新的对象。 s i n g k t o n :保证一个类仅有一个实例,并提供一个访问它的全局访 问点。 2 2 2 结构型( s t m c m r a l ) a d a p t e r :将一个类的接口转换成客户希望的另外一个接口。a d a p t e r 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 b r i d g e :将抽象部分与它的实现部分分离,使它们都可以独立地变 化。 c o m p o s i t e :将对象组合成树形结构以表示“部分- 整体”的层次结 构。c o 玎叩o s i t e 使得客户对单个对象和复合对象的使用具有一致性。 d e c o m t o r :动态地给一个对象添加一些额外的职责。就扩展功能而 言,d e c o r a t o r 模式比生成子类方式更为灵活。 f a c a d e :为子系统中的一组接口提供一个一致的界面,f a c a d e 模式 定义了一个高层接口,这个接口使得这一了系统更加容易使用。 f l y w e i g h t :运用共享技术有效地支持大量细粒度的对象。 p m x y :为其他对象提供一个代理以控制对这个对象的访问。 2 2 3 行为型( b e h a v i o r a l ) c h a i no fr e s p o n s m i l n y :为解除请求的发送者和接收者之间耦合, 而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着 武汉工程大学硕士学位论文 这条链传递该请求,直到有一个对象处理它。 c o m m a n d :将一个请求封装为一个对象,从而使你可用不同的请求 对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操 作。 i n t e r p r e t e r :给定一个语言,定义它的文法的一种表示,并定义一个 解释器,该解释器使用该表示来解释语言中的句子。 i t e r a t o r :提供一种方法顺序访问一个聚合对象中各个元素,而又不 需暴露该对象的内部表示。 m e d i a t o r :用一个中介对象来封装一系列的对象交互。中介者使各 对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变 它们之间的交互。 m e m e n t 0 :在不破坏封装性的前提下,捕获一个对象的内部状态, 并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状 态。 o b s e r v e r :定义对象间的一种一对多的依赖关系,以便当一个对象的 状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。 s t a t e :允许一个对象在其内部状态改变时改变它的行为。对象看起 来似乎修改了它所属的类。 s t r a t e g y :定义一系列的算法,把它们一个个封装起来,并且使它们可 相互替换。本模式使得算法的变化可独立于使用它的客户。 t e m p l a t em e t h o d :定义一个操作中的算法的骨架,而将一些步骤延 14 第2 章j a v a 泛型与设计模式 迟到子类中。t 唧l a t em e m o d 使得子类可以不改变一个算法的结构即可 重定义该算法的某些特定步骤。 v i s i t o r :表示一个作用于某对象结构中的各元素的操作。它使你可 以在不改变各元素的类的前提下定义作用于这些元素的新操作吲。 武汉工程大学硕士学位论文 第3 章设计模式的j a v a 泛型实现 3 1j a v a 泛型的编程思想 g e n 嘶ct y p e s 已经被广泛的在j a v ac o m 瑚l l l l i t y 中被应用了,现在它已 是j 2 s e l 5 中的一部分了。g 舶c r i c 卿e s 最先出现在集合类中( c o l l e c t i o n a p t ) 。下面这个例子使用标准的j 2 s e l 4 1 类库编写的。 a r f a y l i s tl i s t = n e wa r r a y l i s t ( ) ; l i s t a d d ( o ,n e wh l t e g e “4 2 ) ) ; i n tt o t a l = ( ( k e g 神l 妣g e t ( o ) ) 谳v a l u e o ; 可以看到最后一行里我们不得不把h l t e g e r 类型转化成为i n t 类型。 这是因为c o l l e c t i o na _ p 1 只能存贮对象,如果不做类型的转换,程序就会 抛出一个c 1 a s s c a s t e x c e p t i o n 异常。 下面我们就用g c n e f i f i e dc o l l e c t i o n sl i b r a n ,编写上面的例了: a m 呵l i s t l i s t 2n e w a r r a y l i s t ( ) : l i s t a d d ( o ,n e wi i l t e g e r ( 4 2 ) ) ; i n tt o t a l = l 觚g e t ( o ) 础v a l u e o ; 请注意变量a m i y l i s t 的类型声明,它指明了这不仅仅是一个任意的 a r r a y l i s t ,还是一个i n t e g c r 类型的a r r a y ir i s l t ,写作a 玎a y l i s t 。我 们说斯a y l i s t 是一个泛型接口,接受类型参数i n t e g e f 创建链表对象的时 候,我们也指定了一个类型参数【蚓。 3 1 1 使用g e n 喇cc l a s s e s g e n e r i cc l a s s e s 的最大宗运用是c o l l e c t o n s ( 群集) ,也就是实现各 第3 章设计模式的j a v a 泛型实现 种数据结构( 例如l i s t ,m a p ,s e t ,h a s h t a b l e ) 的那些c l a s s e s 。也有人称它们 为容器( c o m a m e r s ) 。这些容器被设计用来存放0 b j e c t d e r i v e d 元素。而 由于j a v a 拥有单根继承体系,任何j a v ac l a s s e s 都继承自 j a v a 1 a n g 0 b j e c t ,因此任何j a v ao b j e c t s 都可以被放进上述各种容器。换 句话说j a v a 容器是一种异质容器,从“泛型”的字面意义来说,其实这 ( 原本的设计) 才是“泛型”。 然而有时候,而且是大半时候,我们不希望容器元素如此异质化。 我们多半希望使用同质容器。即使用于多态( p o l y m o r p h i s m ) ,我们也希 望至少相当程度的规范容器,令其元素类型为“带有某种约束”的b a s e c l a s s 。例如面对一个准备用来放置各种形状( 圆圈、椭圆、矩形、四方 形、三角形) 的容器,如果我们能够告知这个容器其每个元素都必须 是s h 印e d e r i v e do b j e c t s ,将相当有助于程式的可读性,并减少错误,容易 除错,甚至可避免一大堆转型( c a s t ) 动作m ( 1 8 】。 j a v a 同质容器的语法如下,其中角括号“”的用法和c + + 完全相 同,角括号之内的指定类型,就是同质容器的元素类型,如图3 1 。 a r r a y l i 8 七g t r i 咿b tr l i 8 t = n 酬a r r a y l i 8 t s t r i w ) ; 8 t r l i 8 t 。a d d ( 。z e r o 。 ; 8 t r l i 8 t a 嗣( 9 0 n e o ) ; 8 t r l i b t a d d ( o t w o 。) ; b t r l i 8 t a d d ( f i v e 。 ; 印8 t e m o u t p r i n c l n f 8 c r l i 8 c ) j 【z e r o ,e ,t 们f i v e 】 图3 1 同质容器的用法。角括号“”内就是元素类型。 武汉工程大学硕士学位论吏 下面是舅一个实铡,糕序员要求容器内的每一个元素都必须是“一 耪形状”,这是一耪“多态”鹿耀,懿鬻3 - 2 ,图3 - 3 ,瑟3 。这些泛型 语法自 l d k1 3 + g j 以来不鹎改变过【1 9 1 【2 0 1 。 窝3 2 典鍪豹“s h a p e ”多态继承体系 嚣3 0 令骞器肉食各零 ls 懿辨元素,并热入一个s 粕爱e ,令融裁一令鼓f c l e 淘3 4 图3 。3 程序健弼所锖i 遣的结莱 茎三皇塑盐堕垄塑! 竺婆型茎壅 3 1 2 定义g l e n 盯i cc l 船s e s 在先前的l i l l l 【e d l i s t 运用实例中,我们曾假设s 廿o k e ,r e 吐c 打c l e 皆继承自s h 印e 如果我们希望这些c 1 嬲s e s 有足够的弹性,让用户得以在 运用这些c l a s s e s 时才指定其内部数据( 长、宽、半径等等) 的类型叫, 那就得用上泛型语法,如图3 5 ,而先前的运用实例也得对应地修改为图 3 6 。 图3 5 自定义g e r i cc 1 踮s e s 本图实现图3 - 3 的继承体系,并以“参数化类型” ( 图中加粗的工w 等等) 代表备c 1 s 内的数据类型 3 1 3 使用g e n e r ca l g 耐血m s 在j a v a 标准库中,针对容器而设计的a k o r i m m s 并不多( 不像c + + 武汉工程大学硕士学位论文 标准库所提供的那么多) ,他,它们都被置于j a v 巩u l i l c o l l e c t i o n s 内以 砌t i cm e t i l o d s 的形式呈现,例如s o r 的,m a x ( ) ,m :i i l o ,o 叩y o ,删0 。图3 - 7 是两个运用实例,其语法和c 抖完全相同:使剧g e n 鲥ca l g o r i t l l i n s 时并 不需要以角括号“。为“参数化类型”做任何具体指定【2 2 】【2 3 1 。 图3 - 6 容器的每个元素类型都是g c n c r i c c l a s s e s ,所以制造元素时必须使用泛 型语法( 角括号) ,与图3 _ 4 比较 型丝璺竺! :竺苎苎苎型! 图3 - 7 运用m a x ( ) 和r i ( ) 3 1 4 定义g c n 喇c a l g 谢m 抛s 定义于任何c l a s s e s 内的任何一个s 协缸cn l e l l l o d ,你都可以说它是个 a l g o r i t h r n s 如果这m e 吐1 0 d 带有参数化类型,我们就称它是g e n e r i c a l g 丽t b l n 例蜘i : ,在某个c 1 船s 之内 p u b l i cs 诅t i c tg m e m o d ( l i s t 1 i s d 这种语法和g e l l e r i cc l a s s e s 有相当程度的不l f d :泛型符号 必须加 第3 章设计模式的j m 泛型实现 在d a s s 名称之后,却必须加在i n c m o d 名称( 及回传类型) 之前【2 4 】【2 5 】。 j d k1 5 比以前版本增加了更多弹性,允许所谓b 咖d e dt y p e p 跚i i n e t e r ,意指“受到更多约束”的类型参数。下例表示g m e m o d o 所收 到的自变量不但必须是个l i s t ,而且其元素类型必须实现c 伽叩盯a b l e : p u b l i cs t a d c tg m e m o d q i s t 订 l i s d j d k1 5 还允许将“不被m t 油o d 实际用到”的类型参数以符号? 表示,例如: p u b l i cs t a t i cl i s t g m e 血o dm i s t l i s t ) r e 咖1 i 盹本例简单地原封不动传回 ) 但上面这个例子无法真正表现出符号? 的用途。一个更合适的 例子请看j d k1 5 的j a v a 1 n j l c 0 1 l e c t i o n s 源码,如图3 - 8 : 例中的? 不能被替换为任何其它符号。图3 8 程序代码所描述的 意义,见图3 9 的细部解释【2 6 】阳。 3 2 创建型模式的泛型实现 创建型模式( c r e a t i 咖a 1p a t t e m ) :为你创建对象,而不必由你直接实 例化对象。针对给定的案例,程序可以在确定创建哪些对象时获得更大 的灵活性口引。 武汉工程大学硕士学位论文 图3 _ 8j d k15 的j a v a 商1c o l l e c 蛀0 n s 源码 图3 9 本图详细解释了图3 _ 8 中的内容 321 工厂模式( f a c t o r y m e l h o d ) 1 、结构: 其结构见图3 1 0 。 2 、意图: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们 一苎! 童丝生堡茎塑! ! 翌鎏型塞翌 _ - _ _ _ _ _ _ _ _ _ _ 一一 具体的类2 4 1 。 3 、适用性: 在以下情况可以使用a b s 仃a mf a c t o f y 模式 一个系统要独立于它的产品的创建、组合和表示时。 一个系统要由多个产品系列中的一个来配置时。 当你要强调一系列相关的产品对象的设计以便进行联合使用时。 当你提供一个产品类库,而只想显示它们的接口而不是实现时。 一叵三三三日 图3 1 0 工厂模式 4 、j a v a 代码示例: i m e r f - a c e c a r f c l a s sf o r di m p l c m e n t sc a r c l a s sc h e v yi n l p l e m e m sc a r ) p u b l i cc l a s sc l a s s i c f a c t o r y p u b l i cs t a t i cc 盯g e t c a r ( s m gc a r t 如e ) 酊 h 嬲h m 印m a p 2 c l a s s i c f a c t o 珥g e i h a s h ( ) ; 武汉工程大学硕士学位论文 s 扭i n gc a r c l a s s = m a p g e t ( c a r i 帅e ) t o s 仃i i l g ( ) ; c l a s sc l a z z = c l a s s f - o f n 锄e ( c a f c l a s s ) : 咖( c 神c l 毗z n e w m s t a l l c e ( ) ; ) c a t c h x c 印t i o ne ) e p r 血s t a c k t r a c e ( ) ;) r e n l m 砌l : ) p u b l i cs t a t i ch a s h m 印g e m a s h 0 h a s h m 印m a p 2n e w h a s h m a p ( ) ; m 印p u t ( ”f o r d ”,”f o r d ”) ; m 印p u t ( ”c h e v y ”,”c h e v y ”) ; r e t u n l
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 营销咨询方案(3篇)
- 木质素复合材料生态友好性评估
- 药抗生素使用课件
- 市场对绿色包装接受度分析报告
- 建筑方案设计与总图审批
- 2025版司法局《财产保全反担保申请书》(空白模板)
- 高徽浆灌浆施工方案
- 药品经营监督检查课件
- 中式建筑方案设计图
- 惠农区网络推广营销方案
- 钢筋混凝土污水管道施工工程施工组织设计方案
- 颅脑外伤患者的麻醉管理专家共识(2021版)
- 质量警示卡模板
- DZ∕T 0219-2006 滑坡防治工程设计与施工技术规范(正式版)
- 《马克思主义基本原理概论》试题库含答案(典型题)
- JJG 86-2011 标准玻璃浮计
- 产业园转让协议样本
- 剪式升降台的驱动机构设计
- 山西省中考语文模拟试卷及答案汇总五
- 25道中国民航航空医生岗位常见面试问题含HR常问问题考察点及参考回答
- SF095广州市社会保险费补缴申请表
评论
0/150
提交评论