已阅读5页,还剩60页未读, 继续免费阅读
(计算机软件与理论专业论文)基于java语言的设计模式识别的研究与应用.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2 01 1m a s t e r sd e g r e et h e s i s u n i v e r s i t yc o d e : 10 2 6 9 s t u d e n ti d :5 1 0 8 1 5 0 0 0 0 8 r e s e a r c ha nd a p p l i c a t i o n a b o u t d e s i g np a t t e r nr e c o v e r y b a s e do nj a 飞厂al a n g u a g e r e s e a r c ha r e a : h ig h ! y 赴! 巡q 煎h y q 垫童p 巫i 坠g s u p e i s o r : a p p l i c a n t : 2 0 1 1 0 4 2 华东师范大学学位论文原创性声明 郑重声明:本人呈交的学位论文基于j 筒,a 语言的设计模式识别的研究与应用, 是在华东师范大学攻读航4 博士( 请勾选) 学位期间,在导师的指导下进行的研究工作 及取得的研究成果。除文中已经注明引用的内容外,本论文不包含其他个人已经发表或 撰写过的研究成果。对本文的研究做出重要贡献的个人和集体,均已在文中作了明确说 明并表示谢意。 作者签名: 日期:叫年丁月卢 华东师范大学学位论文著作权使用声明 基于j a 、,a 语言的设计模式识别的研究与应用系本人在华东师范大学攻读学位 期间在导师指导下完成的祯左博士( 请勾选) 学位论文,本论文的研究成果归华东师范 大学所有。本人同意华东师范大学根据相关规定保留和使用此学位论文,并向主管部门 和相关机构如国家图书馆、中信所和“知网”送交学位论文的印刷版和电子版;允许学 位论文进入华东师范大学图书馆及数据库被查阅、借阅;同意学校将学位论文加入全国 博士、硕士学位论文共建单位数据库进行检索,将学位论文的标题和摘要汇编出版,采 用影印、缩印或者其它方式合理复制学位论文。 本学位论文属于( 请勾选) ( ) 1 经华东师范大学相关部门审查核定的“内部”或“涉密 学位论文木, 于年月 日解密,解密后适用上述授权。 ( 、) 2 不保密,适用上述授权。 导师签名本人签名 一f 年了月f 日 “涉密”学位论文应是已经华东师范大学学位评定委员会办公室或保密委员会审定过的学位 论文( 需附获批的华东师范大学研究生申请学位论文“涉密”审批表方为有效) ,未经上 述部门审定的学位论文均为公开学位论文。此声明栏不填写的,默认为公开学位论文,均适 上述授权) 。 , jf, 学位论文独创性声明 本人所呈变的学位论文是我在导师的指导下进行的研究工作及取得的研究成果。据我所知除 文中已经注明引用的内容夕卜,本论文不包含其他个人已经发表或撰写过的研究成果。对本文的 研究做出置要贡献的个人和集体,均已在文中作了明确说明并表示谢意。 作者签名:一 日期: 学位论文授权使用声明 本人完全了解华东师范大学有关保留,使用学位论文的规定,学校有权 保留学位论文并向国家主管部门或其指定机构送交论文的电子版和纸 质版。有权将学位论文用于非赢利目的的少量复制并允许论文进入学校 图书馆被查阅。有权将学位论文的内容编入有关数据库进行检索。有权 将学位论文的标题和摘要汇编出版。保密的学位论文在解密后适用本规 定。 学位论文作者签名:导师签名: 日期:日期: 0 ;缸鬈; j j i f 遣硕士学位论文答辩委员会成员名单 姓名职称单位备注 刘静教授华东师范大学主席 软件学院 陈铭松副教授华东师范大学 软件学院 彭超副教授华东师范大学 软件学院 论文摘要 设计模式概念的引入,使得更多的人开始在程序设计时使用适当的模式简化程 序人员编写代码的复杂度、提高代码质量【l0 1 。但随之而来的问题是由于人们对设计 模式在理解上存在错误或者是因为在代码实现上与自己预先设计的存在偏差导致设 计模式使用错误的现象越来越多【9 1 。本文在基于g o f 的深入理解基础上,分析了面 向对象类与类、对象与对象之间的关系,并将他们对应为谓词关系,建立谓词关系 演算法则。这样我们就将判断用户代码是否满足某些设计模式的问题转化为了图论 上的可满足性问题。最后我们以j 筒缇语言为代表,分别在静态和动态环境下提取 我们所关心的类和对象的关系并进行关系演算。最终通过这种方法实现了完全由机 器对用户代码设计模式的自动检查以及用户自定义关系的自动检查。 关键词:关系演算;设计模式;u t p ;j a 、,a 虚拟机;属性检查 a b s t r a c t d e s i 盟p a t t e n l sa r ew i d e l yu s e di i ld e s i 盟o fs o m l ,a r ep r o d u c ti 1 1p r a 以c e ,m o r ea i l d m o r es o 觚a r ed e v e l o p e r su s et h es u i t a b l ep 甜e n li nt h e i ra r c h i t e c t u r ei 1 1o r d e rt or e d u c e t 1 1 er e d u p l i c a t ec o d e sa n ds h o r t e n 也ed e v e l o p m e n tc y c l e a tt h es 锄et i m e ,d u et ot h e d i f f 色r e n tl e v e l s0 fu n d e r s 切n d i n g ,s o m ed e v e l o p e r sd on o te m p l o yt h ed e s i g np a t t e n la s w h a t 也e ye x p e c to rt h e yi m p l e m e n ti n c o r r e c t l yi nm e i rc o d e s ow ep r e s e n to u rw o r ki n d e s i 甑p a t t e mr e c o v e r yb a s e do nj a v al 姐g u a g e w ed e v e l o pam n t i m ea p p r o a c ht oe x p l o r e 也ep a t t e m s 丘o mja v as o u r c ec o d e t o c a p t l l r e 也e 试h e r e n tr e l a t i o n sa m o n gp a t t e m s ,w ee m p l o yar e l a t i o n a lc a l c u l u st os p e c i 母 m ep a t t e r si 1 1ap r e c i s ew a y t 1 1 i sc a l c u l u s c a i lc a p t u r et h er e l 撕o n ss u c ha si n h 甜t a l l c e , c r e a _ t i o n ,r e f 矗e n c ee t c 锄o n go b je c t sa h l dc l a s s e s o nt h eo t l l e rh a n d ,w eu s ead y n 锄i c w a yt oc o n s 饥1 c tt 1 1 eo b j e c td i a 伊锄心o ms o u r c ec o d e t h u s ,w e 仃a n s f o n nt h ep a 仕锄 d i s c o v e 巧p r o b l e mi i l t ot h es a ro n eo nt h em o d e lw ec o n 鲫n l c t w i 也c o n s 仃a i n ts o l v e r ( 1 i k es a ts o l v e r ) ,w ec a nd e c i d ew h e t h e rt h ep a t t e n l sr e g u l a t e db yt h er e l a t i o n a lc a l c u l u s e x i s ti i lt h e 百v e nj a v as o u r c ec o d e t l l e c o r r e s p o n d i n gt 0 0 1h a l sb e e ni m p l e m e n t e da n d t h ep r e l i m i n a r ye x p e r i m e n t ss h o wm a to u ra p p r o a c hi se a e c t i v e k e yw o r d :r e l a t i o n a lc a l c u l u s ;d e s i 萨p a 钍e m ;u t p ;j a :讼v i m l a lm a c l l i n e ; p r o p 耐yc h e c 虹n g 6 第一章引言 1 1 研究背景 目录 1 2 文章的组织结构。 第二章关系演算 2 1 关系演算简介 2 2 关系表达式的创建。 2 3 设计模式举例 第三章关系捕获 3 1 静态关系 1 5 1 7 2 3 2 3 3 1 1 c l a s s 文件结构2 3 3 1 2 获得类名 3 1 3 继承关系。 3 1 4 包含关系 3 2 动态关系 3 2 1 j t i ( 删1 o o li i l t e r f a c e ) 3 2 2 算法表述。 3 2 3 举例 :! ! ; 2 5 2 6 2 9 2 9 3 ( 1 :;:; 第四章可满足性计算3 6 4 1s a t 算法描述。 4 2s a t 求解葛器 3 6 d l o 第五章实验分析 5 1 实验设计4 1 5 2 实验结果分析4 4 第六章总结与展望 6 1 总结。 z i ! ; 4 1 ; 6 2 展望4 6 7 1 1 研究背景 第一章引言 随着面向对象语言的不断发展,面向对象编程成为具备高重用性的设计方式, 但同时类与类以及对象与对象之间的关系变得越发复杂,使人们更加关心他们彼此 之间的关系。g a m m a 【m 1 等人收集总结了多种设计中常用的结构和方法,再此基础上 对他们进行了形式化定义,这样这些常用的结构和方法就可以套用于更广泛的场景。 设计模式的诞生主要带来了两点变革。第一,在软件开发上更为规范,对于相同或 类似问题上有了较为通用有效的解决方案。第二,软件维护成本随之降低,开发人 员在开发文档等设计资料中不必再对某个模块做过多的说明,只需要告知使用了何 种设计模式即可。由于这些设计模式都是具备良好的重构性,因此也给软件二次开 发上留下了很大的空间。 使用设计模式进行软件开发固然是一件令人振奋的事情,但慢慢我们发现会有 一些程序开发人员在开发过程中无意识的运用了某些设计模式或者由于软件设计文 档缺失等问题使得对源代码设计结构掌握起来较为困难。因此在过去的一段时间, 很多反向工程领域的研究人员集中精力到代码中的设计模式挖掘当中来。例如r f e r e n c 等人针对c c + + 语言制作的工具c 0 1 u m b u s 【2 6 1 ,该工具首先根据其定义的样式 对源文件进行抽取,找出源代码中各个类和对象行为的特性,并在此基础上建立他 们的抽象表示。具体表现为实体集合的一系列属性和一系列关系。并将这些关系和 属性描述为抽象语义图( a b s 仃a c ts e m a n t i cg r a p h ) 。c 0 1 啪b u s 的初衷是建立一套支持 工程处理、数据提取、数据存储、交换、可视化、过滤等功能的框架型工具。这些 功能就为以后的反向工程的特殊需求建立了基础。这样展开设计模式挖掘的工作就 会容易很多。c a n 2 d p m 就是其中的一个用来做设计模式识别的插件。c a n 2 d p m 定义了一种称为设计模式标记语言( d e s i 印p a t t e mm a r l 叩l a n g u a g e ) 用来抽象语义 图上所包含的信息,如果图能够满足设计模式标记语言所表述的设计模式,那么就 认为我们找到了满足该种设计模式的一个或者多个实例。另外m a i s a 2 2 】也是以 c o l 啪b u s 输出结果作为输入文件的一个高效的设计模式识别工具。它转化为约束求 解的方法来寻找设计模式。 b l e w i 仕提出了一种模式识别语言s p i n e 【l 】,这种语言允许用户在代码中定义一 些函数和谓词,然后由一个证明引擎来判断他们是否实现了所预想的设计模式。此 外在得到类之间的关系和对象关系信息的基础上,a 1 1 0 y 语言和分析器【2 8 】是在此基 础上建立的支持一阶逻辑量词,传递性和闭包的工具【引。它的应用范围包括源代码 分析和测试用例自动生成以及网络配置等。在对象关系的基础上建立起来的关系型 数据库也在逐渐被人们所接受。关系型数据库借用了面向对象的在建模层次表达的 丰富性和对象间关系建立的强逻辑性。此外一些项目像0 切e c t m a p p e r 【2 1 】等致力于在 得到对象关系的基础上解决面向对象编程和关系型数据库建模之间的障碍问题。 a 1 b i n a m i o t 等人创建了一种称为模式描述语言( p a t t e md e s 嘶p t i o nl a i l g u a g e ) 【1 1 】来从 源代码中搜寻设计模式并有能力生成相应的源代码。吸引人注意的是他们的系统不 但可以对设计模式进行识别,并且可以在源代码转换引擎的帮助下对不适当的设计 模式进行修复。 相比之下t o n e l l a 和a n t o n i 0 1 并没有从传统的模式匹配方法为切入点,没有先建 立一个经典的设计模式库,然后将目标源代码与库中的模式进行依次匹配的传统手 段,而是直接从源代码中发现重复使用的模式,他们使用了概念分析【1 4 】的方法来识 别分享同一关系的不同类组,他们只所以使用该方法来进行设计模式识别是因为他 们认为设计模式是一种形式化的概念,通过构建出递归上下文可以帮助他们找到最 优概念。a s e n c i o 等人使用一种叫h i l a 百x 【2 9 】的工具来对源代码进行解析。h n a 百x 工 具可以从系统设计层面到实现层面透视源代码,使用户可以可视化的观察程序的各 个维度,其中包括类、程序之间的依赖,程序控制结构,数据的使用情况等,并且 将这些信息保存在数据库中。a s e n c i o 等人用声明性的规范来描述各种设计模式, 之后将描述语言转化为p 灿o n 源代码,利用他们在数据库中搜寻能否得到满足的设 计模式。这个系统已经在一些软件上进行了测试,得到了一些不错的结果,与此同 时也发现了不少错误命中的实例。归结原因是主要是因为设计模式中有些模式本身 就存在着结构的相似性,例如状态模式和策略模式,代理模式和装饰者模式,单从 9 类关系上来分析很容易将其混淆。c 锄p o 等研究人员认识到了只是从源代码中静态 分析的局限性,因此他们认为有些模式的辨别只有在动态的环境下才能将具体行为 表现出来。w e n d e h a l s 等人持有同样的观点,首先他们对程序执行静态分析,筛选 出有可能存在设计模式的候选者进行插桩,以便捕获这些候选者的动态行为,那么 在运行时就可以比较容易的分辨出哪些是真正使用了某种设计模式,哪些没有使用。 更近一步还可以区分出具有相似结构的设计模式,例如前面所提及的状态模式和策 略模式。他们在u m l2 0 的时序图上进行实验分析,并得到了理想的结果【2 3 】。 忙o s 是一种面向对象的语言,也是一种基于组件的模型驱动的软件开发途径 2 1 。他是在关系语义,精化演算和模型检验的基础上建立起来的语言。贮o s 为每 个模型定义了他的属性,目的是为了保证模型的正确性和可验证性。这些属性包括 子类型、可见性、引用、继承、转型等。这就激发了我们去定义一些属性用以检查 和识别设计模式中所用到的模式匹配。不同于之前的工作【2 4 】:我们定义了两类属性, 一类是通用属性,另外一类是用户相关属性。第二种属性是第一种的灵活扩展,是 为了检查避免随着代码复杂度加大等原因,用户虽然正确地使用了某种设计模式, 但是实际上并没有按照用户的预期运行。 为了刻画类之间以及对象之间的关系,我们对他们建立了一定关系。在类的层 次上,我们建立继承( h h 舐t a i l c e ) 和包涵( c o n t a i n ) 两种关系。在对象的层次上,我们 建立创建( c r e a t e ) 、调用( c a l l ) 和引用( r e f e r e n c e ) 三种关系。有了这些关系,我们接下 来定义了关系的运算法则。利用这五种关系以及运算法则,我们就可以对大部分的 关系属性加以描述。由于关系演算本身是建立在图论的基础之上,那么很自然的我 们想到将关系的可满足性问题转化为关系图上的可满足性计算问题。我们实现了经 典的s a t 可满足性算法作为我们系统中的s a t 求解器组件。 为了捕获我们之前在类和对象之间建立的5 种关系,我们实现了j a 、,a 语言的 关系捕获工具。第一阶段我们在j 越,a 编译得出的c 1 a s s 文件中静态获取到类之间的 关系。这一阶段主要是通过j a 、,a 规范中关于c l a s s 文件的格式说明,提取出我们需 要的类名、接口名、超类名和所实现的接口名。第二阶段在运行时捕获对象间的关 系。我们为此设计了一套算法,通过维护一个栈结构的机制对对象上的操作进行记 1 0 录,并借助j a 、,a 虚拟机工具接口( j v mt 0 0 1i n t e m c e ) 得以实现。接着我们设计了适 当的关系演算算法用以检查模型属性的可满足性。最终我们选择了s a t 解析器【3 0 】 进行求解并将之转化为图论中的求解可达性问题。基于以上思想,我们的j 筒从对 象关系捕获工具可以表示为图1 : 图1 :实现纲要 j a 、,a 对象关系捕获工具完成后,我们设计了相关实验检验工具的正确性。通过 对g a m m a 【1 0 】所著的经典设计模式的学习理解,在三大类设计模式中挑选几种为代 表用关系表达式将他们表达出来,并用小规模的代码进行检测关系表达式是否正确。 所选的6 个设计模式分别为属于创建型设计模式的抽象工厂模式,属于行为设计模 式的策略模式、观察者模式,属于结构性模式的组合模式、适配器模式和外观模式。 1 2 文章的组织结构 本文是按照以下结构展开进行的: 第二章介绍了关系演算的背景概念,在此学习的基础上引入了我们用来描述类 和对象的关系谓词表达继承1 1 1 1 1 ( x ,y ) 、包含c o n ( x ,y ) 、引用r e f ( x ,y ) 、创建c r e ( x , y ) 和调用c a l ( x ,y ) 这五种关系并建立起他们之间的演算规则,用以来描述g o f 中的经典设计模式。 第三章讲述了如何在j a 、,a 语言上捕获我们所关系的五种关系,本章分别介绍 了在静态时和动态时两种状态下的捕获方法。静态下通过读取j 心,a 编译后得 到的c 1 a l s s 文件结构获得类上的关系,动态下通过监控j a 、厂a 虚拟机获得对象之 间的操作关系。 第四章介绍了将代码转化为关系谓词之后再如何传递为一个检验可满足性求解 问题来验证是否满足特定的一组关系表达式并对实现算法进行了相应的介绍。 文章第五章设计了相应的实验来验证几种设计模式是否可以被检验出来,介绍 了实验环境和实验方法。 文章最后一章作为结束语对本文现有工作做了总结并进行了展望。 1 2 第二章关系演算 2 1 关系演算简介 关系及关系演算是数学领域中的一个基本概念,离散数学中所涉及到的关系及 其运算对研究计算机科学中的许多问题如数据库、数据结构、情报检索等都是很好 的分析工具。我们常见的关系数据库就是在此基础上发展起来的。关系及关系运算 扩充了以往我们习惯运用的连续数学运算方式的内容与种类,使得运算对象不再仅 局限于实数集,而是扩大到了各种抽象的,不连续的研究范围,从而加强了计算机 处理各种实际问题的能力,使计算机在更多领域内得到更广泛的应用。关系演算语 言即逻辑语言,是由变量、常量、逻辑连接词和量词等构成的演算。在一套语言规 则上建立的表达式称为公式,公式的解为满足该表达式的一组或多组变量的赋值使 得表达式为真。统一程序理论( u n i 劬n gt h e o r i e so fp r o 伊a m m i n g ) 】是关系演算中较 为成熟且应用广泛的一种理论基础。统一程序理论权衡了以下三个方面。第一,现 在计算机已经发明了许多种程序语言,并且还有很多正在发明着,他们可以根据其 结构和实现技术分为更小的可计算模式。最早也是应用最为广泛的是命令式语言, 设计命令式的程序需要规划好可重复使用的计算机存储空间,这种语言的代表有 f o i 玎凡州,c o b o l ,p a s a c a l 和c ,程序化语言的特点则为他们与可更新内存空 间不相关,以l i s p 【1 7 】,m l 【1 8 】和h a s k e l l 【1 2 】为代表。逻辑语言是一种给出满足解必须 满足条件,来求解的反向回溯的过程,以p r o l o g 【19 1 、c l p 【1 5 】和c h i p 【1 6 1 为代表。 其中又以p r o l o g 较为流行,它是法国马赛大学的柯尔密勒设计并实现了一种基 于谓词演算的逻辑程序设计语言,该语言不久即在众多计算机上得以实现。这样一 来,现实世界中的问题只要能用谓词演算公理系统方式表示出来,就可以将它写成 p r o l o g 程序,然后在计算机上得以实现。第二,每种计算模式在权衡简洁性和准 确性之后又可以用不同层次的抽象来描述。第三,我们可以选择一种数学技术简单 有效地表达每种理论的基础。u t p 理论是建立在对以上三个不同方面的学习之后, 定义出了基本的理论元素,并且经过对真实世界的观察和实验之后证明为有效的理 论基础。u t p 理论中使用字母表来描述技术专有名字的概念。例如:i n i t i a ls t a t e x , y ,z ) ,其中x ,y z 等代表了不同的初始状态。接着,为了表达这些目的的符号 称作为签名,他们有 原语( p 血n i t i v e ) 赋值语句:( x := e ) 、空( e m p t y ) 、跳过( 幽p ) t o p ( t ) b o t t o m ( 上) 组合算子( c o m b i i l a :c o r s ) : 条件选择c o n d i t i o n a l :p 飞q 组合c o m p o s i t i o n :p ;q 不确定性选择:p q 递归:ux f ( x ) 数学上可以证明的等式统称为规则,规则一方面是为了表达程序设计,另一方面是 为了预测程序运行的结果。 1 4 2 2 关系表达式的创建 我们借用了u t p 中的标示符并加以适当扩展,形成了满足我们对象关系捕获需 求的关系演算语言,以下是关系演算语言的描述: b r := i n h ( x ,y ) ( 1 1 1 1 1 撕t a n c e ) c o n ( x ,y ) ( c o n t a i n m e n t ) lc a l ( x ,y ) ( c a l l ) c r e ( x ,y ) ( c r e a t i o n ) r e f ( x ,y ) ( r e f 打e l l c e ) r := b r ( b a s i cp r e d i c a t e s ) r 八r ( a n d ) rvr ( o r ) r = r ( i m p l i c 撕o n ) r ;r ( c o m p o s i t i o n ) rq b r ( c o n d i t i o n a l ) i :r ( n e g a t i o n ) fr + ( t r a n s i t i v ec l o s u r e ) v x ;y r ( x ,y ) ( a n y ) ij x ;y 4 r ( x ,y ) ( e x i s t e n c e ) 其中1 1 1 l l ( x ,y ) 表示类x 是类y 直接继承。c o n ( x ,y ) 表示在静态关系上类x 包含类 y 。这两个谓词的引入是为了静态描述类之间的关系。c a l ( x ,y ) 表示对象x 调用对象 y 的一个方法。c r e ( x ,y ) 表示对象x 创建了对象y 。r e f ( x ,y ) 表示对象x 引用了对象y 。 这三个谓词的引入是为了动态描述对象间的关系,因此这三种关系是在对象运行时 进行捕获的。其他的关系谓词是一些原子性谓词,是用于两个关系之间的连接。r 八 r 表示逻辑与,关系上的同时满足用该符号描述。r v r 表示逻辑或。r = r 代表 蕴含关系。r :r 表示串行操作。它表示一个程序先由前面的一个r 运行,当它结束 1 5 它将其结束状态作为后面的一个r 的开始运行状态的输入。r 飞r 表示条件选 择。在b 为真的情况下执行b 之前的r ,在b 为假的情况下执行b 之后的r 。! r 是 逻辑上取反。r + 表示的是r 的传递闭包,用于判断图的连通性和图中满足条件的连 通分支,在描述调用和继承等关系的时候将十分有用。v x ;y r ( x ,y ) 表示不论x ,y 为何值,始终满足r 关系。暑x ;y r ( x ,y ) 表示存在这样的x ,y 满足r 关系。有了以 上谓词,我们可以用该语言精确的表述标准的设计模式了。 1 6 2 3 设计模式举例 设计模式简介 可复用面向对象软件系统现在一般划分为三大类:应用程序、工具箱和框架 ( f r 锄e w o r k ) ,我们平时开发的具体软件都是应用程序;j a 、,a 的a p i 属于工具箱;而 框架是构成一类特定软件可复用设计的一组相互协作的类。e j b ( e n t e 印r i s e j a :、,a b e a i l s ) 是j a 、,a 应用于企业计算的框架。框架通常定义了应用体系的整体结构, 类和对象的关系等等设计参数,以便于具体应用实现者能集中精力于应用本身的特 定细节。框架主要记录软件应用中共同的设计决策,框架强调设计复用,因此框架 设计中必然要使用设计模式。另外,设计模式有助于对框架结构的理解,成熟的框 架通常使用了多种设计模式,如果你熟悉这些设计模式,毫无疑问:你将迅速掌握 框架的结构,我们一般开发者如果突然接触e j bj 2 e e 等框架,会觉得特别难学, 难掌握,那么转而先掌握设计模式,无疑是给了你剖析e j b 或j 2 e e 系统的一把利 器。软件构架中设计模式的提出从根本上解决了代码复用,增加可维护性。 面向对象中的三个设计原则是“开放一关闭”原则,里氏代换原则,合成复用 原则。“开发一封闭”原则是说模块对应扩展是开放的,而对修改是关闭的,代码的 扩展尽量要保证在不修改的原则下进行。里氏代换原则是继承复用的一个基础,使 之达到的效果成为如果调用的是父类,那么换成子类也是完全一样的效果。合成复 用原则就是说多用合成,少用继承来实现。将波动限制在尽量小的范围。在j a 、,a 中就是说尽量针对接口编程,而非实现类,这样更换子类就不会影响调用它方法的 部分。要让各个类尽可能少的跟别其他类联系,因此扩展性和维护性才能提高。g o f 合著的设计模式一书第一次对设计模式进行归纳整理,将其提升到理论高度, 并将他们规范化。书中从动机、适用性、参与者、应用场景、实现、应用效果、解 决方案等多方面描述了设计模式。实际上,g o f 的设计模式并不是一种具体”技术”, 它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧, 让你能够真正掌握接口或抽象类的应用,从而在原来的j a 、,a 语言基础上跃进一步, 更重要的是,g o f 的设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重 用。对于特定场合的问题,提供了一个经过充分验证的通用模式的解决方案,每个 模式通过描述其组成方式、责任、相互关系以及他们的协作方式来具体制定。设计 模式可以分为以下三种类型: 创建型模式 对象的创建和对象的使用分开也就成为了必然趋势。因为对象的创建会消耗掉 系统的很多资源,所以单独对对象的创建进行研究,从而能够高效地创建对象就是 创建型模式要探讨的问题。通过实例化将职责委托给其他对象,隔离客户程序与具 体类型实例化之间的相互依赖,这样就可以确保外部模块获得的具体类型实例与生 产者不产生直接的引用。主要的创建型模式有单例模式,抽象工厂模式、原型模式 在占 口o 结构型模式 在解决了对象的创建问题之后,对象的组成以及对象之间的依赖关系就成了开 发人员关注的焦点,因为如何设计对象的结构、继承和依赖关系会影响到后续程序 的维护性、代码的健壮性、耦合性等。对象结构的设计很容易体现出设计人员水平 的高低。这一类的模式关心类和对象之间怎么组织起来形成大的结构。主要使用继 承来组织接口或实现。主要的结构型模式有适配器模式、桥梁模式、合成模式等。 行为型模式 在对象的结构和对象的创建问题都解决了之后,就剩下对象的行为问题了,如 果对象的行为设计的好,那么对象的行为就会更清晰,它们之间的协作效率就会提 高。这一类的模式关心的是算法以及对象之间的任务分配。它所描述的不仅仅是对 象或类的设计模式,还有它们之间的通讯模式。主要的行为型模式有责任链模式、 命令模式、解释器模式等。 下面我们以组合模式和抽象工厂模式为例,用我们上一节所定义的关系演算来 将他们描述出来: 组合模式 在得到组合模式的类图描述下( 图2 ) ,我们可以描述为如下表达式: 暑x ,y ,z 。i n h + ( x ,z ) 八c o n ( z ,x ) 八( i n h + ( y ,z ) 入v a ! i n h ( a ,y ) ) 上面的公式表示存在一个与其先前节点有包含关系的枝节点c o m p o s i t e 且与父节点 也存在传递闭包性质的继承关系,同时存在一个叶子节点l e a f 与c o m p o s i t e 的父节 点也存在传递闭包性质的继承关系,并且l e a f 节点不存在子节点与之构成继承关 系。在例子中x 在这里代表c o m p o s i t e ,y 代表l e a z 则代表c o m p o n e l l t 。 除了以上所描述的属性外,还有一条属性是: c a l ( c l i e n t ,c o m p o s i t e ) _ j l e “c a l ( c o m p o s i t e ,l e 的 它表示如果有c 1 i e n t 对枝节点c o m p o s i t e 的调用,那么可以推出存在一个叶子节点 l e a f ,使得枝节点c o m p o s i t e 调用了这个叶子节点l e a f 。 图2 :组合模式类图 1 9 抽象工厂模式: 抽象工厂模式1 3 1 是为了解决新对象的创建对原有系统的影响问题的一种设计模 式。该模式降低了创建实例和使用实例的耦合,将创建实例集中在一起得以有效控 制。 c l i - l l t m t a 卜s t r a 以l 二r ) c r e a 执fj c f c 矗t 8 1 图3 :抽象工厂模式类图 由以上类图我们可以得到通用属性的表达式如下: 暑c o n c r e t e f ,c o n c r e t e a ( c r e ( c o n c r e t e f ,c o n c r e t e a ) 八暑c l i e n t r e f ( c l i e l l t ,c o n c r e t e f ) 暑a b s 纰l c t f i i l l l ( t y p e o f ( c o n c r e t e f ) ,a b s 仃a c t f ) 入暑a b s 仃a c t a h m ( t y p e o f ( c o n c r e t e a ) , a b s t r a c t a ) ) 墨熏 筹 图4 :工厂模式特定场景类图 在一个指定的场景下( 如图4 ) ,如果我们想检查一个工厂究竟生产了哪些产品, 那么我们可以通过如下表达式的可满足性: c r e ( e n c h a i l t e d m a z e f a c t o 吼e n c h 肌t c d r o o m ) c r e ( e n c h a l l t e d m a z e f a c t o w a l l ) 八c r e ( e n c h a l l t e d m a z e f a c t o d o o r n e e d s p e l l ) 八c r e ( b o m b e d m a z e f a c t i o 嘞d o o r ) c r e ( b o m b e d m a z e f a 曲d r y ,b o m b e d w r a l l ) 八c r e ( b o m b e d m a z e f a c t o r y ,r o o m w i m b o m b ) 这里我们想检验d 0 0 r b o m b e d w a l l l 和r o o m w i t h b o m b 是否由一个实例工厂生 产,e n c h a i l t e d r 0 0 m ,w a l l 和d o o r n e e d s p e l l 是否由同一实例工厂生产。 暑x c r e ( x ,e n c h a i l t e d r o o m )c r e ( x ,w a l l ) 八c r e ( x ,d o o r n e e d s p e l l ) ) 八暑y c r e ( y , r o o m w i t h b o m b ) c r e ( y ,b o m b e d w a u ) c r e ( y ,d o o r ) ) 如果我们想进一步检查e n c h a j l t e d m a z e f a c t o 巧是否只生产e n c h a n t e d r o o m ,w a l l , d o o r n e e d s d e l l 这三种产品,那么我们可以加上如下表达式: 2 1 v y e e n c h a n t e d r o o m ,w a l l ,d o o f n e e d s p e l l g ) ! c r e ( e n c h a n t c d m a z e f a c t o y ) 最后面的表达式限制了e n c h a n t e d m a z e f a 曲o w 的行为只能生产e n c h a l l t e d r o o m ,w a l l , d o o r n e e d s p e l l g 这三种产品。 第三章关系捕获 我们需要获得五种关系,分别为继承( i i l l l 翻t a n c e ) 、包含( c o n t a i n ) 、创建( c r e a t e ) 、 调用( c a l l ) 和引用( r e f - e r e l l c e ) 。前两个是静态关系,后三个为动态关系。我们分别通 过两种方法来获得。静态关系通过读取编译后的c 1 a s s 文件来获得( 包含关系有所 区别,见3 1 4 ) ,动态关系利用j v m t i ( j a 、,a s d k1 6 ) 对j v m 监视事件的处理框 架,通过处理相关事件的回调来获取。 3 1 静态关系 3 1 1 c 1 a s s 文件结构 j 筒舱的c 1 a s s 文件是一种非常紧凑的,由8 位字节流组成的二进制文件,由于 其严格的结构框架【8 1 ( 如表1 ) 类型名称 数量 u 4 m 画c 1 u 2m i n o rv e r s i o n1 u 2 m 句o r _ v e r s i o n l u 2 c o n s t a n t - p 0 0 l c o u n t 1 c p j n f oc o n s t a i l t _ p 0 0 1 c o n s t a n t p o o j c o 吡 1 u 2 a c c e s s n a g s 1 u 2 t h i sc l a s s1 u 2 s u p e r - c l a s s l u 2 1 1 1 t e r f a c e sc o u n t1 u 2i i l t e r f b c e si n t e r f a c e s c o u n t u 2f i e l d sc o u n tl u 2f i e l d sf i e l d sc o u n t 表1 :j a 、,a c l a s s 文件结构 顺序读取二进制字节流。u 2 、u 4 是c 1 a s i 文件中的基础类型,每个c 1 a s s 文件 都包含了类名、实现接口、父类、成员变量和成员函数等信息。其中我们所关心的 主要有m a g i c ( 魔数) ,其作用在于分别出j a 、,ac l a s s 文件和非j a 、,ac 1 a s s 文件; c o n s t a n tp 0 0 1c o l l i l t ( 常量池计数) 、c o n s t a i l tp 0 0 1 ( 常量池) ,其中包含了与文件中类和 接口相关的常量。常量池中存储了诸如文字字符串、f i n a l 变量值、类名和方法名的 常量。j 心,a 虚拟机把常量池组织为入口列表的形式。在实际列表c o n s t a n tp 0 0 1 之 前,是入口在列表中的计数c o n s t a l l tp 0 0 1c o u n t 。常量池中的许多入口都指向其他 的常量池入口,而且c 1 a s s 文件中紧随着常量池的许多条目也会指向常量池中的入 口。在整个c 1 a s s 文件中,指示常量池入口在常量池列表中位置的整数索引都指向 这些常量池入口。a c c e s sf l a g s ( 访问标志) 字段表示的意思指明了文件中定义的是类 还是接口;还定义了在类或接口的声明中,使用了哪种修饰符:是抽象的还是公共 的,或者是f i n a l 。类的类型可以为f i n a l ,而缸a l 类不可能是抽象的,同时接口也 不能为丘n a l 类型。t h i sc l a s s ( 该类的类名) 和s u p e rc l a s s ( 超类名) ,特殊的,对于 o b j e c t 类,s u p e rc l a s s 为o ,除此以外s u p e rc l a s s 对于所有的类均有效。对于接口, 在常量池入口s u p e rc l a s s 位置的项为j a 、,a 1 a n g o b j e c t 。i i l t e r f a c ec o u n t ( 接口计数) 的含义是在文件中由该类直接实现或者由该接口所扩展的父接口的数量,紧接在他 后面的是i l l t 曲c e s ( 接口数组) 包含了对每个由该类直接实现或者由该接口所扩展的 父接口的常量池索引。在读取c 1 a s s 文件内容前,先读取所有的c 1 a s s 文件名获得用 户自定义的类的白名单,用于关系的筛选。 3 1 2 获得类名 读取两字节的也i sc l a s s 项,其值是一个对常量池表项的索引,即指向一个常量 池项,由于该常量池表项必为c o n s t a n tc l a s si n f o 表【3 】,读取其中的n 锄ei n d e x 项,获得指向另一个常量池表项c o n s n tu t f 8i n f o ,获得类名。 3 1 3 继承关系 我们定义两种情况皆为继承关系,分别是继承父类和实现接口。j 筒,a 是单继承 结构所以它的父类只有一个,读取s u p e rc l 觞s 项 4 】,该项是对常量池的有效索引或 者值为o 。若为0 ,该c 1 a s s 文件表示为j a 、厂a 1 a i l g o b j e c t 类。若不为0 则判断c 1 a s s 的类型,若不是接口,那么通过有效索引,在常量池得到c o n s t a n td a s si n f o 的 n 锄ei n d e x ,进而得到另一个常量池的有效索引,获得父类名。若父类是用户定义 的类,则第一类继承关系捕获。 每个c 1 a s s 文件的i n t e r f a c e - c o u n t 5
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教师招聘考试试题及答案题完整版
- 教育法律法规试题及答案大全
- 施工质量安全相关试题及答案分享
- 月嫂时间管理试题及答案
- 构建稳定有效的国家金融监管体系
- 常见病各种应急预案(3篇)
- 普通财务个人述职报告
- 街道办事处半年工作总结
- 强化涉农资金管理
- 2025年南平浦城公安招聘警务辅助人员9人考试笔试模拟试题及答案解析
- 棉花各生长阶段田间长相图片
- 年金(复利)终(现)值系数表
- GB/T 32473-2016凝结水精处理用离子交换树脂
- GB/T 19494.3-2004煤炭机械化采样第3部分:精密度测定和偏倚试验
- 遗传学试题库及答案-(12套-)
- 硫酸包装说明和使用说明书
- 山东师范大学成人教育《新闻写作》期末考试题库
- DBJ53T-69-2014云南省建筑与市政基础设施工程施工现场专业(管理)人员配备标准
- 放射CT质控考核表
- 清淤工程施工记录表
- 名字由来作文-完整版PPT
评论
0/150
提交评论