版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章软件复用技术软件复用软件复用早在20世纪50年代用机器语言编写程序时就开始运用。作用:软件复用通过充分利用已有开发成果,消除包括分析、设计、编码、测试等在内的许多重复劳动,极大地提高了软件开发的效率。同时,通过复用高质量的已有开发成果,避免了重新开发可能引入的错误,由此也保证了软件的高质量。
10.1软件复用概述
所谓软件复用是指利用已有的、对建立新系统有用的软件制品来形成新系统的活动。目前,人们对软件复用寄予厚望,认为其有可能成为突破软件危机的一条出路。
10.1.1软件复用目的
1、缩短软件开发和维护的时间;2、降低软件开发和维护的成本;3、保证软件的可靠性;4、保证软件的一致性;5、保护投资者的利益;…
10.1.2软件复用的类型
软件复用可以分为横向复用和纵向复用两种类型。横向复用是指复用不同应用领域中的软件成份,如数据结构、算法、人机界面构件等。面向对象设计模式是一种典型的横向复用机制。纵向复用是指在一类具有较多共性的应用领域之间复用软件成份。纵向复用活动的关键在于领域分析:根据应用领域的特征和相似性,预测软件成份的可复用性。一旦确认了软件成份的可复用价值,便进行开发,然后将开发得到的软件制品存入可复用构件库,供未来开发项目使用。
10.1.3软件复用的内容
软件复用的内容,除了源程序代码外,还有许多其它软件制品,甚至特定的分析建模方法、检查技术、质量保证过程等,均可以被复用。C.Jones定义了10种可能复用的软件制品:项目计划、成本估计、体系结构、需求模型和规格说明、设计、源代码、用户文档和技术文档、用户界面、数据、测试用例。10.1.4针对复用的过程模型
领域分析领域设计(软件体系结构开发)领域实现(可复用软件制品开发)领域模型领域构架可复用软件制品库领域知识领域工程系统分析规约&设计建造系统规约分析&设计模型应用软件用户需求应用工程10.1.5软件复用成功实施的关键
管理者的支持;(复用影响了企业的组织结构、文化和软件技术等)复用支持组的建立;(承担可复用软件制品的建立、获取、验证、分类和管理)复用库的创建;(复用库用来对可复用软件制品进行分类、组织、存储和管理)复用驱动的方法支持。(一方面指导可复用制品的建立人员识别复用机会和侯选的可复用制品,并建立一个可复用制品,另一方面指导应用软件开发人员寻找可复用制品,并利用它们组装成新的应用。)10.1.6复用成熟度模型(IBM)成熟度等级复用比例过程复用制品范围工具初始级没有复用-20%至20%特定的过程子程序宏个人没有库监控级原始的复用10%至50%项目级的过程模块包小组非正式的数据库协调级计划的复用30%至40%标准的过程子系统模型框架部门有配置管理功能的数据库计划级正式的复用50%至70%大规模的复用应用程序生成器现场复用库牢固级领域分析80%至90%软件组装过程特定领域体系结构公司一组特定领域复用库的集合10.1.7针对复用的软件项目组织
高层经理支持者创建者复用者库管理工具可复用制品库存取分类、存储检索复用复用检索规格可复用制品奖罚奖罚奖罚报告报告报告职责创建者负责从复用者手中接受可复用制品的设计规格说明,进行可复用制品的设计、实现和质量控制,重点考虑可复用制品的可复用性。
复用者负责软件系统开发任务。
复用支持者负责可复用制品的资格确认、质量保证、分类和存储。
高层经理负责管理、组织和协调各类软件复用活动,并处理所有与复用有关的事务性工作。
10.2领域工程
所谓领域是指一组具有相似或相近软件需求的应用系统所覆盖的功能区域。领域工程则是为领域中的应用工程建立基本能力和必备基础的过程,它覆盖了建立可复用软件制品的所有活动。作用:领域工程有助于产生具有较高可复用性的软件制品。同时,领域工程产生的领域模型和领域构架有助于针对复用的开发。
10.2.1领域工程与应用工程的关系
在单个应用系统工程(简称应用工程)的开发过程中,软件开发人员的任务是在特定的条件下,针对一组特定的需求产生一组特定的设计和实现。领域工程对领域中的应用系统进行分析,识别这些应用系统的共同特征和可变特征,对刻画这些特征的对象和操作进行选择和抽象,形成领域模型,依据领域模型产生出领域中应用系统共同具有的体系结构DSSA或生成过程。并以此为基础识别、开发和组织可复用制品。
领域工程和应用工程是相互联系的
一方面,领域工程的主要信息来源是通过应用工程得到的现有系统,包括需求规格说明、设计、实现等。另一方面,领域工程和应用工程需要解决一些相类似的问题,如:如何获取并表示用户需求?如何设计并表示设计模型等。
领域工程要适用于一族系统,而不只是一个系统。因此,领域工程比应用工程要复杂,往往不能事先设计划好,也很难实施管理。10.2.2领域工程过程
领域分析(目标主要是获得领域模型)领域设计(目标是获得领域构架DSSA)领域实现(主要目标是定义将需求翻译到由可复制品创建的系统的机制)领域工程是一个反复的、逐渐精化的过程,在实施过程中都可能返回到以前的步骤,对以前的步骤得到的结果进行修改和完善后,再回到当前步骤。
10.2.3领域工程参与人员
领域专家
(任务:提供关于领域中应用系统的需求规约和实现的知识,帮助组织规范的、一致的领域字典,帮助选择样本系统作为领域工程的依据,复审领域模型、DSSA等领域工程产品,等等)领域分析员
(控制整个领域分析过程,进行知识获取,将获取的知识组织到领域模型中,根据现有系统、标准规范等验证领域模型的准确性和一致性,维护领域模型。)领域工程参与人员领域设计人员(控制整个领域设计过程,根据领域模型和现有的系统开发出DSSA,验证DSSA的准确性和一致性,建立领域模型和DSSA之间的联系。)领域实现员
(根据领域模型和DSSA,或者从头开发可复用制品,或利用再工程技术从现有应用系统中提取可复用制品,对可复用制品进行验证,建立DSSA与可复用制品间的联系。)10.2.4领域模型
领域模型描述了领域中一些基本的概念,如功能、特性、数据、对象类和需求,以及这些概念间的相互关系,是领域内系统的通用和差异属性、属性和领域概念的意义以及差异属性之间的依赖性的明确表示。
领域定义
通过给出领域内已有系统的例子、反例(领域外的系统)以及有关规则(例如,“任何具有某能力X的系统属于该领域”)来定义领域的范围。它也给出了接纳或拒绝接纳一个给定系统或功能的基本原理。
领域字典和概念模型领域字典:定义领域词汇。
概念模型:以某种合适的方式,例如对象图、类图、交互图、状态转换图或实体关系图或数据流图等,和非正式文本来描述领域内的概念。
特征模型
定义一组可重用的和可配置的需求,用于指定一个领域内的系统。
特征和特征模型最初由FODA(FeatureOrientedDomainAnalysis,面向特征的领域分析)方法引入的。
在FODA中,特征是指系统的一个最终用户可见的特性。例如,汽车的传动装置是自动的或手动的。
特征模型由特征图、特征定义、特征组合规则和特征原理(特征的选择与不选择原因)等组成。
例子(FODA)汽车传动装置马力空调手动自动二者选一必需的可选的组合规则:“空调”需要“马力”大于105特征原理:“手动”可以使燃烧效率更高10.2.5领域构架
领域构架是使用可复用制品来构造领域中应用系统的高层设计模型(软件构架)。
软件构架(softwarearchitecture):抽象地说,软件构架描述了构建系统的元素、元素间的交互、指导元素组合的模式以及对这些模式的限制。管道/过滤器模式和层次体系结构模式是两种典型的软件构架模式。
管道/过滤器模式结构每个构件都有一组输入和输出,构件读输入的数据流,经过内部处理,然后产生输出数据流。
入库请求商品检验入库清点商品入库检验单入库单已入货库存单过滤器管道管道/过滤器模式特点使得软构件具有良好的隐蔽性和高内聚、低耦合的特点;支持软件重用只要提供适合在两个过滤器之间传送的数据,任何两个过滤器都可被连接起来;允许设计者将整个系统的输入/输出行为看成是多个过滤器的行为的简单合成;系统维护和增强系统性能简单新的过滤器可以添加到现有系统中来;旧的可以被改进的过滤器替换掉;允许对一些如吞吐量、死锁等属性进行分析;支持并行执行每个过滤器是作为一个单独的任务完成,因此可与其它任务并行执行。
管道/过滤器模式不足不适合处理交互的应用。当需要增量地显示改变时,这个问题尤为严重。易导致进程成为批处理的结构。这是因为虽然过滤器可增量式地处理数据,但它们是独立的,所以设计者必须将每个过滤器看成一个完整的从输入到输出的转换。因为在数据传输上没有通用的标准,每个过滤器都增加了解析和合成数据的工作,这样就导致了系统性能下降,并增加了编写过滤器的复杂性。
层次体系结构模式结构
每一层为上层服务,并作为下层客户;内部的层只对相邻的层可见;连接件通过决定层间如何交互的协议来定义。验证密钥管理
文件接口密码层用户最内层是密码层,包括加密和解密的功能,用于系统最基本的加密策略。第二层是文件级的接口,即加密和解密一个文件。第三层是密钥管理,它允许一个组件在一份文件上签名,证实签名后,计算出一个散列码作为访问这个文件的权限限制。最后,第四层提供验证,这一层管理一个密码文件,这个文件以加密形式存储,并且要求用户输入身份验证(比如用户名)和密码。
客户机/服务器体系结构(2层)
数据存储在集中式管理的服务器中,客户机则负责数据处理和用户界面的表示。由客户提出一个服务的请求,然后由服务器响应这个请求。
不足:复用受限于特定的数据库格式;数据处理逻辑改变困难;…。用户界面数据存储数据处理客户服务器r三层体系结构
两层模型的一种修改方案。用户层用于向用户显示系统中的数据并允许用户输入和编辑数据。
业务逻辑层用于执行业务功能和数据规则。业务逻辑层为用户层提供服务。
数据存取服务封装了底层的数据存储的信息。
用户接口用户服务数据存取服务数据存储数据层业务逻辑层用户层业务服务层次体系结构模式的特点支持基于抽象程度递增的系统设计,使设计者可以把一个复杂系统按递增的步骤进行分解;依赖性局部化,因为每一层至多和相邻的上下层交互,因此功能的改变最多影响相邻的上下层;支持重用只要提供的服务接口定义不变,同一层的不同实现可以交换使用,这样,就可以定义一组标准的接口,而允许各种不同的实现方法。
层次体系结构模式的不足并不是每个系统都可以很容易地划分为分层的模式,甚至即使一个系统的逻辑结构是层次化的,出于对系统性能的考虑,系统设计人员不得不把一些低级或高级的功能综合起来;很难找到一个合适的、正确的层次抽象方法;当某个层次的构成和行为发生变化时会产生连锁反应。
FODA方法领域分析由卡内基·梅隆大学的软件工程研究所提出的领域工程方法。它支持对某领域中系统共性和个性的发现、分析和文档记录。步骤:上下文分析;领域建模;构架建模。上下文分析
上下文分析的目标是定义领域的范围。在这个步骤中要分析领域与外部元素间的关系,例如不同的操作环境,不同的数据需求等。还要对可变性进行评价。上下文分析的结果是上下文模型。
屏幕管理系统上下文模型领域建模
根据领域范围,分析领域中应用系统的共性和差异,并建立领域模型,主要包括以下三种活动:特征分析:获得客户或最终用户对一类系统的一般能力的理解,即特征。信息分析:定义和分析为实现领域中应用所需的领域知识和数据需求。
操作分析:识别领域中应用的行为特征。例子:屏幕管理系统特征图之一例子:屏幕管理系统信息模型
操作分析选择特征的处理方法1:每个特征分开方法2:采用参数分开方法3:采用继承分开构架建模
构架建模为领域中的应用提供软件解决方案,其焦点是识别并发进程和面向领域的共同模块。
屏幕管理系统体系结构FODA活动与产品其它方法ODM(OrganizationDomainModeling,组织领域建模),由Synquiry有限公司的MarkSimos开发。Draco,由JamesNeighbors在其博士研究工作中开发。DSSA方法、DARE方法、代数方法等等。传统软件工程与领域工程的比较
软件工程
领域工程需求分析为特定系统制作需求领域分析对一组系统制作可复用、可定制的需求系统设计为特定系统进行设计领域设计制作用于一组系统的可复用的设计系统实现得到一个系统产品领域实现制作可复用的组件、内部结构和制作过程10.3组件技术概述
我们能如此开发软件吗?10.3.1组件的定义与复用
组件(Component),亦称构件,是指语义完整、语法正确和有可重用价值的单位软件,它是语义描述、通信接口和实现代码的复合体。简单地说,组件是具有一定的功能,能够独立工作或能同其它组件装配起来协调工作的程序体,其使用同它的开发、生产无关。组件可分为源代码组件和二进制代码组件。
可复用组件应具备的属性
①有用性——组件必须提供有用的功能;②可用性——组件必须易于理解和使用;③质量——组件及其变形必须能正确工作;④适应性——组件应该易于通过参数化等方式在不同语境中进行配置;⑤可移植性——组件应能在不同的硬件运行平台和软件环境中工作。
组件复用方式组件复用有白盒和黑盒两种方式。黑盒是指不作修改的直接引用;白盒指进行适应性修改的引用。源代码在大多数情况下是指适应性修改地引用;二进制代码组件的复用只能采用黑盒方式,通常只能了解组件的接口和属性等信息。
10.3.2组件模型
组件模型通常由基于各种语言开发工具、组件嵌入机制和相关服务(事务、安全、认证、负载均衡等)组成。
比较成熟的组件模型有OMG的CORBA、SUN的EJB(JavaBean)和Microsoft的COM/DCOM/COM+。
三种组件模型间的差别
COM为组件交互定义了一个二进制的标准,只是Windows平台上广泛采用的模型。CORBA可以运行在多种不同操作系统上,与平台和语言无关,但它不是一个二进制的标准。EJB(EnterpriseJavaBeans)是一个服务器端组件模型,JavaBeams是一个可供使用的组件,主要用于构建客户端软件并特别考虑了GUI组件的需要。EJB和CORBA兼容,并可能相互促进。由于EJB要求所有组件都要用Java编写,而Java必须运行在Java虚拟机上,从而会导致Java很难与非Java代码实现紧密集成。
10.3.3组件获取与描述
通常可以采用以下途径来获取组件:从现存组件中获取得符合要求的组件,直接使用或作适应性修改,得到可复用的组件;通过遗产工程,将具有潜在复用价值的组件提取出来,得到可复用的组件;从市场上购买现成的商业组件,即COTS(CommercialOff-The-Shelf,商业现货)组件;开发新的符合要求的组件。
组件获取后,可对它进行结构化组织并放入可复用组件库,以备复用。组件描述
属性。描述了组件的特征。属性值对外可以读出,也可以修改。功能接口。即组件向外提供的服务。依赖关系。指出组件在实例化时所依赖的其它组件的特定接口,是组件完成其任务所必需的。
10.3.4组件分类
关键词分类用户界面窗口菜单对话框事件处理图形窗口文本窗口信息对话框数据录入对话框拖放处理键盘事件处理多面分类方式
10.3.5组件检索
基于关键词的检索(在图形用户界面上将可复用组件库的关键词树直观地显示给用户,用户通过逐级浏览关键词树寻找需要的关键词并提取相应的组件;或直接输入含通配符的关键词由系统自动给出合适的候选组件清单,用户选择并提取相应的组件。);多面检索(构造查询、检索组件、排序组件)。上述两种检索方法均基于语法匹配,这要求使用者对组件库中的有关词汇有较全面的把握和较精确的理解。理想的检索方法是语义匹配:组件库的用户以形式化的手段描述所需组件的功能或行为的语义,系统通过定理证明或基于知识的推理来寻找语义上等价的或相近的组件。
10.3.6组件使用
理解组件(①组件的功能与行为;②相关的领域知识;③可适应性约束条件与例外情形;④可以预见的修改部分及修改方法);修改组件;合成组件(基于功能的合成技术:调用与参数传递、基于数据的合成技术:调用与参数传递、面向对象的合成技术:继承)。10.4公共对象请求代理体系结构
公共对象请求代理体系结构(CommonObjectRequestBrokerArchitecture,CORBA)是由对象管理组织OMG制定的一个工业规范,其主要目标是提供一种机制,在此基础上,对象可以透明地请求和获得应答。CORBA的实质是远过程调用与面向对象技术的有机结合。
OMG于1990年制订了OMA(ObjectManagementArchitecture),它可用任何方法来实现,CORBA是其中的一种实现方案。
OMA(层次结构)OSORBServicesFacilitiesDomainObjectsObjectsObjectsObjectsObjects10.4.1CORBA的组成
客户程序(Client)对象实现(Server)动态调用接口静态IDL存根ORB接口动态骨架接口静态IDL骨架对象适配器ORB核GIOP/IIOP接口存储数据库实现存储数据库ORB核/ORB接口
ORB(ObjectRequestBroker)该是作为对象互通信的软总线。ORB截获服务请求调用,然后识别网络中服务器的位置,即对象实现的位置。若服务器不在运行,则ORB启动服务器,并一直等待到它准备接受服务请求为止。
ORB接口是ORB核给出的接口,同时为客户和对象实现方所见,提供了一些只能由ORB核提供的服务:对象引用操作、ORB初始化、对象适配器初始化和获取初始对象引用。
ORB之间的互操作则采用GIOP和IIOP实现。
ORB的特性可使客户程序不用考虑:服务器编程语言、服务器平台、服务器地点和网络协议。
ORB提供了两个用于存储有关对象信息的服务:接口仓库(接口存储数据库)和实现仓库(实现存储数据库)。
IDLIDL(InterfaceDefinitionLanguage)是用于说明对象接口的标识语言。作用:接口概念一方面把对象的使用与对象的实现彻底分开;另一方面ORB使用对象的接口描述可在异类环境下实现不同数据格式的转换;第三,IDL编译程序能把接口描述直接映射到目标语言,极大地加快了代码开发。
例子
ModuleShapes{interfaceRectangle{attributeIntegerlength;attributeintegerwidth;integerarea();voiddraw();
voidtranslate(inintegerX,inintegerY);}interfaceSquareRectangle{}}
module用来引入一层作用域;Interface集中一些相关的操作;attribute标识了具有get/set存取器函数对的数据成员;in表输入;out表输出;inout表输入输出。
IDL编译由IDL编译器根据IDL代码生成相应编程语言的客户代理(骨架)和服务器代理(存根)对象等。
静态调用
静态调用是指通过静态IDL存根和静态IDL骨架进行的调用过程。静态IDL存根对客户端来说可看作它的远端对象,即服务器代理;静态IDL骨架对对象实现来说可看作它的客户端,即客户代理。静态调用必须在编译时就知道特定的目标对象的接口信息。静态IDL存根和静态IDL骨架由编译IDL接口定义语言文件得到。
客户端ORB请求静态IDL存根打包请求(源编程语言格式样→传输格式)ORB传递且激合对象实现静态IDL骨架解包(传输格式→目的编程语言格式)对象实现动态调用
动态调用接口(DynamicInvocationInterface,DII)和动态骨架接口(DynamicSkeletonInterface,DSI)可分别被视为通用存根和通用骨架,它们由ORB直接提供不依赖于所调用对象的接口。
客户端运期间发请求DII根据接口库提供的IDL接口信息通过函数Create-request动态创建对象请求ORB传递DSI从进入的消息中找出调用的目标对象及相应的方法,并提供运行时的连接机制对象实现对象适配器
对象适配器是ORB与对象实现间的接口,其主要的工作如下:
对象实现的注册;生成及管理对象引用;服务器进程激活;对象激活/撤销/向上调用。10.4.2ORB运行机制
1.开始;2.客户获取特定对象实现的对象引用;3.如果对象以静态方式实现,则通过IDL存根向对象实现发出请求,然后转6;4.将请求发给ORB提供的DII;5.DII根据接口库的信息将请求传递给对象实现;6.ORB传递请求;7.ORB内核在请求到达后做一定的处理,然后将其送给对象实现登记的对象适配器;8.对象适配器接收请求;9.如果不是本ORB域登记,则转13;10.如果有相应的IDL骨架存在,则对象适配器通过IDL骨架调用对象实现中的方法,并转17;11.对象适配器通过DSI调用对象实现方法;12.转17;13.将请求传给DSI;14.DSI产生一个代理对象;15.代理对象将请求转成中间协议表示形式传给目的ORB;16.目的ORB将中间协议表示形式转换成本地DII请求,以实现对对象实现中的方法进行调用;17.将结果按原路返回给客户;
10.4.3基于CORBA的软件开发
①编写OMG定义的IDL接口规范说明文件,描述服务对象所支持的操作和类型;②编译IDL规格说明文件,生成客户端存根和服务器端骨架;③编写对象实现程序;④编写服务器和客户主程序结构;⑤将对象实现程序,服务主程序和生成的服务器骨架编译连接成服务端可执行程序;⑥将客户端主程序和生成的客户端存根编译连接成客户端可执行程序,且若服务器端是基于Web和浏览器方式的,则相应地编写HTML超文本文件,链入编写的客户方JavaApplet小程序;⑦分别运行服务器端和客户端程序。
10.4.4CORBA的特点
同时支持分布计算技术和面向对象技术。支持许多现存的语言并把这些语言混合到一个分布式应用系统之中。
代理机制使得客户端程序和服务器端程序完全分离,这样服务器端和客户端程序都可自由地修改而无需通知对方。
提供了“软件总线”的功能,实现了软件组件的即插即用。
提供了一种高度的互操作性,保证了建立在不同CORBA产品之上的分布式样对象能够相互通信。
10.5组件对象模型
组件对象模型(ComponentObjectModel,COM)是微软(Microsoft)的组件软件方案,是为组件的互操作而定义的二进制组件模型。分布式组件对象模型(DistribntedComponentObjectModel,DCOM)是COM的一个分布式扩充,是在分布式计算环境的远程过程调用的基础上开发的。COM+是按COM的标准建立的,并组合了一些工具的新版本,如MTS(MicrosoftTransactionServer)、MSMQ(MicrosoftMessageQueues)等。
10.5.1COM标准
COM作为一面向对象的编程模型,目的是提高软件的交互协同工作能力,而不受开发语言和方法、运行环境和地点的限制。
在Windows系统平台上,一个COM组件或是一个DLL文件,或是一个EXE文件。
一个组件程序可以包含多个COM对象,每个COM对象可以实现多个接口。COM组件COM对象COM对象COM接口COM接口COM对象
在COM规范中,并没有对COM对象进行严格的定义。COM对象同C++语言中的类一样,也包括属性和方法。属性反映了对象的状态,方法则是对象提供给外界的接口,客户必须通过接口才能获得对象的服务。COM对象以提供功能服务为主,可用来替代传统的API(ApplicationProgrammingInterface)函数。
COM对象标识客户并不直接访问COM组件,而是通过一个全局标识符进行对象的创建和初始化工作。在COM的规范中,每个对象有一个128位的全局惟一标识符GUID(GloballyUniqueIdentifier)来标识,称为CLSID(ClassIdentifier)。(GUID不是专门用来定义COM对象标识符的,且GUID是一个随机数)COM库提供了一个API函数产生GUID:
HRESULTCoCreateGuid(GUID*pguid);COM对象与C++对象的不同封装性:COM对象只能通过其提供的接口成员函数访问对象属性;而C++有可能直接访问对象中的数据成员。可重用性:COM通过包容或聚合实现重用;而C++主要通过继承实现重用。客户对象B对象AISomeInterfaceISomeInterfaceIOtherInterface客户对象B对象AISomeInterfaceIOtherInterface包容聚合COM接口
COM规范的核心内容是关于接口的定义。
COM接口有两种:标准接口和用户接口,用户接口是用户为COM对象设计的接口。标准接口是COM规范定义的,可用来访问有关COM对象的信息。
在标准接口中,所有COM对象都预定要执行IUnknown接口。如果要支持后期绑定,则需要IDispatch接口,其它还有与一组存储有关的IPersist系列接口。
接口结构类似于COM对象的标识,COM接口也采用GUID,称为IID(interfaceidentifier).客户使用一个COM对象的接口,必须知道接口的IID和接口提供的方法。接口指针PVtable指针指向功能1指向功能2…对象实现Vtable(virtualfunctiontable)(供客户使用)标准接口IUnknownQueryInterface返回COM对象可否提供有关的接口服务;函数输入为接口标识符。如果COM对象实现了该接口,则返回接口指针,否则返回空。AddRef和Release调用并处理COM对象引用计数器,用于管理COM对象的生命周期,每当创建一个新的对已有COM对象的引用时,AddRef方法便被调用,从而将COM对象引用计数加1。当客户不再需要时,通过Release将引用计数减1,当引用计数减到0时,对象便清除自己。
接口定义语言(MIDL)微软用其接口定义语言MIDL来精确定义接口,每一接口中的方法以及每一方法的参数。MicrosoftVC++提供了MIDL工具,可把IDL接口描述文件(*.idl)编译成C/C++语言兼容的接口描述头文件(*·h)供组件程序和客户程序使用。
例子定义接口,并用MIDL编译实现:QueryInterface实现:AddRef和Release实现用户接口COM库
在MicrosoftWindows操作系统环境下,COM库以DLL文件的形式存在,其中包括以下几项内容:提供少量的API函数,用来加速客户和服务器COM应用程序的创建;完成对象实现的定位服务。它根据唯一的类标识,通过系统注册表来确定类和服务器实现的地址。实现透明的远过程调用,以支持在本地或远程服务器中运行的对象。提供一套应用程序如何控制其进程空间里内存的分配和释放的标准机制。
COMAPI函数定位服务(方法1)COM库注册表组件程序如果是EXE,则会有一点点不同系统注册表信息(windows2000)组件向系统注册代码同样也应有清除注册用代码!也可手工操作注册表完成!类工厂(实现IClassFactory接口)用于控制组件的生存周期用于创建COM对象获取类工厂10.5.2COM客户/服务器模型客户服务器进程内调用在进程内,服务器组件和客户程序运行在同一地址空间中,一旦客户程序与组件程序建立通信关系,客户程序就可以通过得到的接口指针直接调用服务器对象的成员函数。
接口指针PVtable指针指向功能1指向功能2…对象实现Vtable(virtualfunctiontable)例子本地调用在同一机器上的不同进程,COM采用了本地过程调用LPC(LocalProcedureCall)实现进程外组件与客户程序的通信。图中虚线表明,对开发人员而言,不需考虑底层细节,COM实现了进程模型的透明,使得客户程序调用接口成员函数好像是直接进行的。
10.5.3分布式COM(DCOM)
对于组件程序与客户程序不在同一主机的情形,DCOM则把COM的进程模型的透明性拓展为位置透明性,把COM中本地跨进程(同一主机不同进程)通信用一个网络协议传输过程来替代,组件程序和客户程序均感觉不到中间发生的过程,只是中间数据传递的路线更长一些。
10.5.4COM+简介
COM+COM+目录负载平衡内存数据库对象池队列组件新的事件模型组件管理和配置MTS事务支持资源分发管理安全模型易化管理COM/DCOM基于接口的编程远程支持基本组件服务分布式组件服务10.6EJB模型
1996年10月,SUN公司推出JavaBean。按SUN公司的定义,JavaBean是一种能在编程工具中被可视化处理的可复用的软件组件。EJB规范是SUN公司于1997年12月发布的JavaBean组件模型。JavaBean组件是一种可用来组装应用程序的组件,不是一个完整的应用程序,不能部署;EJB组件则是可部署的组件,用来完成服务器端的操作,需要赖以生存的运行环境,需初始化和提供其它服务的容器,而JavaBean则不需要。
10.6.1JavaBean组件模型
JavaBean组件JavaBean组件JavaBean组件JavaBean组件JDBCJava服务器CORBA服务器数据库服务器RMIIIOP数据库协议InfoBusJavaBean框架JavaBeans和类库的关系JavaBeans适合可以可视化地操作从而完成某项功能的软件。如:按钮、标签等。类库适合于对程序员提供一些功能,但并不太适合进行可视化操作的模块。如访问JDBC数据库的接口。JavaBeans与外部接口一个JavaBeans组件主要通过属性、方法和事件来与外部环境进行交互。JavaBeans属性反映了组件的特征。JavaBeans引入了联系和约束属性。一个联系属性当其值改变时通知其他对象;一个约束属性值的改变可以被其他组件否决。JavaBeans自查自查(内省)是在运行时发现JavaBeans组件的属性、方法和事件的过程。两种方式:通过寻找遵循某种命名模式的类和方法(隐式提供信息);通过查询某个类的BeanInfo。JavaBeans组件开发(JBuilder6)创建JavaBeans组件建立一个工程文件(File/NewProject);建立一个JavaBean类(File/New);设计界面(用户窗口的Design标签);添加属性和事件;编译成Class文件;打包成JAR文件(Wizards/ArchiveBuilder).注册JavaBeans组件(Tools/ConfigurePalette-AddComponent)按SelectLibrary按钮;选Project后按New按钮;按Add,选中打包后的文件名;按AddFromSelectedLibrary;按OK退出。//此后便可如同Jbutton一样使用创建的组件10.6.2EJB体系结构
EJB容器本地接口远程接口实体BeanEJB容器本地接口远程接口会话BeanJavaServelets或JavaServerPages或JavaApplication(RMI)客户端数据库EJB结构要素EJB服务器是管理EJB容器的高端进程或应用程序,由开发商提供。EJB本地接口为客户创建、删除、查找EJB远程接口对象的句柄提供相应的操作。本地对象是由EJB容器产生的对本地接口的实现,用来创建EJB对象。EJB远程接口为EJB提供特定的业务客户接口方法。EJB对象是由容器产生的对远程接口的实现,所有客户端的调用都要访问EJB对象,EJB对象将调用委托给实体Bean(或会话Bean)的实例。会话Bean包含与商务处理相关的逻辑实现。实体Bean提供对企业数据的访问。
本地接口和本地对象EJB容器和服务器本地对象EJB对象EJB客户端程序3:返回EJB对象引用1:创建一个新的EJB对象
本地接口
远程接口2:创建EJB对象远程接口和EJB对象EJB容器和服务器EJB对象EJB客户端程序5:返回结果1:调用一个方法事务服务安全服务2:调用J2EE服务4:方法返回3:调用BeanEJB运行机制基于组件的应用开发中的有关角色10.7可复用面向对象设计模式
面向对象设计模式最初出现于70年代末80年代初。1987年W.Cunningham和K.Beck引入建筑师C.Alexander的模式概念。
面向对象设计模式是普通面向对象设计问题的解决方案,这类问题以一组交互类的形式出现,用户根据需要定制这些交互类以形成专门的设计。作用:设计模式不仅使人们可以更加方便地复用成功设计方案,也能提高已有系统的文档管理和系统维护的有效性。
10.7.1设计模式的描述与分类
一个设计模式事实上是系统地命名、解释和评价某一重要的可重现的面向对象设计方案。所有设计均可从四个方面加以描述:模式名称:用一至两个词描述设计问题、解决方案和效果。模式名称便于使用者在更高的抽象层次上进行设计并交流有关设计思想。问题描述:指明使得设计模式可以被应用所必须存在的环境条件。它解释了设计问题及其背景。解决方案:描述了设计方案的组成部分,它们之间的关系及各自的职责和协作方式。效果:描述应用设计模式后的结果及使用模式应权衡的问题。
Gamma分类类别设计模式名称意图简要说明创建型模式抽象工厂(AbstractFactory)提供创建相关的或相互依赖的一族对象的接口而无需指定具体的类。生成器
(Builder)将一个复杂对象的创建与它的表示分离,使得同样的构建过程可以创建不同的表示。工厂方法
(FactoryMethod)定义一个用于创建对象的接口,由子类决定实例化哪一个类。原型(Prototype)使用一个原型指定要创建的类的类型,通过拷贝这个原型得到新的对象。单件
(Singleton)保证一类仅有一个实例,并提供一个全局性的访问点。Gamma分类结构型模式适配器
(Adapter)将一个类的接口转换成用户希望得到的另一种接口,使原来由于接口不相容而不能一起工作的类可一起工作。桥(Bridge)将类的抽象部分与它的实现部分分离,使它们可以相互独立地变化。组合(Composite)将对象组成树结构来表示局部和整体的层次关系,使单个对象和组合对象的使用具有一致性。装饰
(Decorator)动态地给一个对象添加新功能。外观
(Façade)给一个子系统的所有接口提供一个统一接口,使子系统便于使用。轻量
(Flyweight)运用共享技术有效地支持大量细粒度对象。类别设计模式名称意图简要说明Gamma分类行为模式职责链
(ChainofResponsibility)将多个接收请求的对象连成一条链,并沿链传递请求,直到有一个对象处理它为止。避免了请求的发送者和接收者之间的耦合。命令(Command)将一个请求命令封闭优一个对象,便于将不同的请求参数化;对请求排对或记录请求日志,以及支持可撤消请求的操作。解释器
(Interpreter)给定一种语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示解释语言中的句子。迭代器(Iterator)提供一种顺序访问一个聚合对象中各元素又不暴露对象内部表示的方法。中介者
(Mediator)定义一个中介对象封装一系列对象的交互。备忘录
(Memento)在不破坏封装的条件下,获得一个对象的内部状态并将它外部化,从而在以后可使对象恢复到这个状态。观察者
(Observer)定义对象一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象均得到通知并被自动更新。状态
(State)允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎能修改它的类。策略
(Strategy)定义一系列算法,把它们均封闭起来,并且使它们可相互替换。它使算法可独立于使用者而变化。模板方法
(TemplateMethod)定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,从而使子类可以不改变算法的结构即可重定义该算法的某些特定步骤。访问者
(Visitor)描述一个作用于某对象结构中各元素的操作,从而可以在不改变被操作元素类的条件下定义新的操作。类别设计模式名称意图简要说明10.7.2创建型模式
创建型模式帮助系统独立于对象的产生、组合和表示。作用:一方面均将关于系统使用哪些具体的类的信息封装起来;另一方面隐蔽了这些具体类的实例是如何被创建和放在一起的。因此,创建型模式在“什么”被创建、“怎样”被创建、“谁”创建它以及“何时”创建等方面带来了很大的灵活性,有利于设计可复用的软件成分。
工厂方法模式(结构)
《interface》Creator《interface》ProductConcreteProductfactoryMethod()ConcreteCreatorfactoryMethod()《creates》Client产品/具体产品类
Product定义工厂方法生成的对象的接口。例如:(Java程序)publicinterfaceProduct{//产品的接口声明}ConcreteProduct实现Product类的接口。例如:publicclassConcreteProductimplementsProduct{//构造函数publicConcreteProduct(){//dosomething}//产品接口实现}创建者/具体创建者类Creator声明一个工厂,返回一个Product类型的对象。也可定义工厂方法的缺省实现。可调用工厂方法生成一个Product对象。例如:publicinterfaceCreator{//工厂方法接口声明
publicProductfactoryMethod();}ConcreteCreator重定义工厂方法以返回适当的ConcreteProduct实例。例如:publicclassConcreteCreatorimplementsCreator{//工厂方法实现
publicProductfactoryMethod(){returnnewConcreteProduct();}}
客户类Client仅使用由Creator和Product声明的接口。例如:publicclassClient{privatestaticCreatorcreator;privatestaticProductproduct;publicstaticvoidmain(String[]args){creator=newConcreteCreator();product=creator.factoryMethod();//dootherthings}}使用条件一个类不知道它所必须创建的对象的类。一个类希望由其子类确定它创建的对象。类将创建对象的职责委派给多个帮助者子类中的一个,且希望将哪一个帮助者子类是代表者这一信息局部化。
依赖倒置原则使用效果
比直接产生对象更灵活。“工厂方法”给子类一个挂钩,以便在子类中扩展。连接平行类层次。当一个类将它的一些职责委托给一个独立的类的时候,就会产生平行类层次。
《interface》FigurecreateManipulator()《interface》ManipulatordownClick()upClick()drag()LineManipulatordownClick()upClick()drag()TextManipulatordownClick()upClick()drag()TextFigurecreateManipulator()LineFigurecreateManipulator()Client结论工厂方法模式在遵循依赖倒置原则方面有重要意义,使得高层策略模块在创建类的实例时无需依赖具体的类。也使得一组类的完全不同序列的实现间进行交换成为可能。工厂方法模式会带来复杂性。抽象工厂模式结构《interface》AbstractFactorycreateProductA()createProductB()ConcreteFactory2createProductA()createProductB()ConcreteFactory1createProductA()createProductB()《interface》AbstractProductAConcreteProductA1ConcreteProductA2《interface》AbstractProductBConcreteProductB1ConcreteProductB2Client抽象工厂/具体工厂类AbstractFactory声明创建抽象产品对象的操作接口。例如:publicinterfaceAbstractFactory{//产品等级结构A的工厂方法
publicAbstractProductAcreateProductA();//产品等级结构B的工厂方法
publicAbstractProductBcreateProductB();}ConcreteFactoryl实现创建具体产品对象的操作。例如:publicclassConcreteFactory1{//产品族1的具体工厂类
//产品等级结构A的工厂方法
publicAbstractProductAcreateProductA(){returnnewConcreteProductA1();}//产品等级结构B的工厂方法
publicAbstractProductBcreateProductB(){returnnewConcreteProductB1();}}//产品族2的具体工厂类的实现与产品族1的具体工厂类类似
抽象产品/具体产品类AbstractProductA声明一种产品对象的接口。例如:publicinterfaceAbstractProductA{//接口声明}//AbstractProductB与AbstractProductA类似
ConcreteProductA1定义将被相应的具体工厂类创建的产品对象;实现抽象产品类接口。例如:publicclassConcreteProductA1implementsAbstractProductA{//构造函数publicConcreteProductA1(){}//接口实现}//其它产品类的定义与ConcreteProductA1类似
客户类Client仅使用由抽象工厂类和抽象产品类声明的接口。例如:publicclassClient{privatestaticAbstractFactoryfactory1;privatestaticAbstractFactoryfactory2;privatestaticAbstractProductAproductA;privatestaticAbstractProductBproductB;publicstaticvoidmain(String[]args){factory1=newConcreteFactory1();factory2=newConcreteFactory2();productA=factory1.createProductA();productB=factory2.createProductB();//dootherthings}}
使用条件系统应与如何创建、组合和表示其产品无关。系统应由多个产品族之一来配置。强调一系列相关产品对象的设计以便联合使用。提供一个产品类库,但只想显示它们的接口。
使用效果
隔离了具体的类。使产品族间的转换容易进行。容易实现一个应用一次只使用同一个系统中的产品对象。难以扩展“抽象工厂”以支持新种类的产品。
不符合开闭原则10.7.3结构型模式
结构型模式涉及如何组合类和对象构成更大的结构。一种方法是采用继承机制来组合接口或实现来形成更大的结构;另一种方法通过对象组合方式对一些对象进行组合来形成。由于对象组合可以在运行时刻改变,而继承机制为静态类组合,因而对象组合方式具有更大的灵活性。
适配器模式结构ClientAdapteeoperation()《interface》Targetrequest()Adapterrequest()利用继承机制ClientAdapteeoperation()《interface》Targetrequest()Adapterrequest()利用组合机制目标/被适配者类Target定义客户类使用的与特定领域相关的接口。例如:publicinterfaceTarget{//定义用户期望的接口
publicvoidrequest();}Adaptee定义一个被用来适配的已存在的接口。例如:publicclassAdaptee{//被适配的接口
publicvoidoperation(){//dosomething}}
适配器类(利用继承机制)Adapter适配Adaptee类中的接口至Target类中的接口。例如://利用继承机制publicclassAdapterextendsAdapteeimplementsTarget{//适配operation为requestpublicvoidrequest(){//调用operationoperation();}}适配器类(利用组合机制)//利用对象组合publicclassAdapterimplementsTarget{privateAdapteeadaptee;//构造函数
publicAdapter(Adapteeadaptee){this.adaptee=adaptee;}//适配operation为requestpublicvoidrequest(){//dootherthingsadaptee.operation();//dootherthings}}
客户类Client使用Target类中的接口。例如://利用继承机制publicclassClient{privatestaticTargettarget;publicstaticvoidmain(String[]args){target=newAdapter();//以后可通过调用target.request()调用adaptee定义的operation()//dootherthings}}客户类//利用对象组合publicclassClient{privatestaticTargettarget;privatestaticAdapteeadaptee;publicstaticvoidmain(String[]args){target=newAdapter(adaptee);//以后可通过调用target.request()调用adaptee定义的operation()//dootherthings}}
使用条件希望使用一个已存在的类,它的接口却与希望的接口不匹配。要创建一个可复用的类,该类可以与其它不相关的类或不可预见的类协同工作。想使用一些已存在的类,但不能对每一个类子类化以匹配它们的接口(仅适用于对象组合的适配器模式)。
使用效果a、对利用继承机制的情况:当想要匹配Adaptee类及其所有子类时,Adapter类将不能胜任。Adapter类可以重定义Adaptee类的行为。不需要间接指针以得到adaptee对象。b、对利用对象组合的情况:允许一个Adapter类与多个Adaptee类一起工作。重定义Adaptee类的行为比较困难。
组合模式(结构)
Client《interface》Componentoperation()add(Component)Remove(Component)getChild(int)Leafoperation()Compositeoperation()add(Component)Remove(Component)getChild(int)children部件类Component为组合中的对象声明接口;在适当的情况下实现所有类共有接口的缺省行为;声明接口用于访问和管理组合对象中的子部件。例如:publicinterfaceComponent{//operationpublicStringtoString();//声明接口publicvoidadd(Componentcomponent);publicvoidremove(Componentcomponent);publicComponentgetChild(intindex);}
叶子类Leaf代表部件中的叶子对象,它没有子部件;定义组合对象中原始对象的行为;对与子部件有关的操作接口实现为空。例如:publicclassLeafimplementsComponent{protectedintid=0;//标识号
publicLeaf(intid){this.id=id;}publicStringtoString(){return(“IamLeaf(ID“+id+“)”);}publicvoidadd(Componentcomponent){}publicvoidremove(Componentcomponent){}publicComponentgetChild(intindex){returnnull;}}
组合类Composite定义有子部件的部件的行为;存储子部件;实现Component类接口中与子部件有关的操作。例如:importjava.util.LinkedList;publicclassCompositeimplementsComponent{protectedLinkedListchildren=newLinkedList();protectedintid=0;//标识号
publicComposite(intid){this.id=id;}publicStringtoString(){return(“IamComposite(ID”+id+“)”);}publicvoidadd(Componentcomponent){this.children.add(component);}publicvoidremove(Componentcomponent){this.children.remove(component);}publicComponentgetChild(intindex){return(Component)children.get(index);}}
客户类Client通过部件类接口操作组合中的对象。例如:publicclassClient{publicstaticvoidmain(String[]args){Componentcomposite1=newComposite(1);Componentcomposite2=newComposite(2);Componentleaf1=newLeaf(1);Componentleaf2=newLeaf(2);Componentleaf3=newLeaf(3);composite1.add(leaf1);composite1.add(composite2);composite2.add(leaf2);composite1.add(leaf3);//dootherthings}}
使用条件
希望表示对象的整体/部分层次结构。希望一致地处理叶子对象和组合对象。使用效果
定义了对象的整体/部分层次结构,且客户代码中任何用到叶子对象的地方均可使用组合对象。简化了客户代码,客户代码不必关心处理的是一个叶子对象还是组合对象,即可以一致地使用叶子对象和组合对象。易于添加新的Composite和Leaf子类,客户代码不必因新的Composite和Leaf子类而改变。使设计更加通用,但难于限制只组合某些特定的部件。
10.7.4行为型模式
行为型模式不仅描述对象或类的模式,还描述它们之间的通信模式。这些模式刻划了在运行时难以跟踪的复杂的控制流。行为型模式使设计者的注意力从控制流转移到对象间的联系方式上。
迭代器模式结构
{abstract}AggregateCreateIterator()ConcreteAggregateCreateIterator()《interface》Iteratorfirst()next()isDone()currentItem()ConcreteIteratorfirst()next()isDone()currentItem()Client迭代器类Iterator定义访问和遍历聚合(aggregate)对象的接口。例如:publicinterfaceIterator{publicvoidfirst();publicvoidnext();publicbooleanisDone();publicObjectcurrentItem();}
具体迭代器类ConcreteIterator实现Iterator类中的接口;在聚合对象遍历时跟踪当前位置。例如:publicclassConcreteIteratorimplementsIterator{privateConcreteAggregateconAgg;privateintindex=0;privateintsize=0;//构造函数
publicConcreteIterator(ConcreteAggregateconAgg){this.conAgg=conAgg;size=conAgg.size();index=0;}publicvoidfirst(){index=0;}publicvoidnext(){if(index<size){index++;}}publicbooleanisDone(){return(index>=size);}publicObjectcurrentItem(){returnconAgg.getItem(index);}}
聚合/具体聚合类Aggregate定义创建相应迭代器对象的接口。例如:abstractpublicclassAggregate{publicIteratorcreateIterator(){returnnull;}}
ConcreteAggregate实现Aggregate类中的接口,返回ConcreteIterator类的一个适当的实例。例如:publicclassConcreteAggregateextendsAggregate{privateObject[]objects={“Dog”,“Pig”,“Horse”,“Monkey”,“Mouse”};publicIteratorcreateIterator(){returnnewConcreteIterator(this);}publicObjectgetItem(intindex){if(index<objects.length){returnobj
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生理性闭经病因介绍
- 《无菌技术南通大学》课件
- 智能制造生产线技术及应用 课后练习题及答案 郑秀丽
- 海蜇蜇伤病因介绍
- 感悟技术(课件)-高中术必修技术与设计1(豫科版2019)
- (麦当劳餐饮运营管理资料)更新商业-麦当劳中国餐厅场地租赁合同文本
- (高考英语作文炼句)第20篇老师译文笔记
- 全套监理资料表格(带索引)
- 兴隆小区北区1#-5A#楼冬期施工方案
- 开题报告:循证决策视角下乡村青年教师价值引领力的状况测评及提升机制研究
- 数量关系课讲义
- 物品借用、归还登记表
- 艺术设计专业的职业生涯规划
- 2023年西藏开发投资集团有限公司招聘笔试题库及答案解析
- 部编版五年级语文上-句子专项课件
- 定性研究方法课件
- 初中语文人教九年级下册《统一》PPT
- 国家开放大学《开放英语4》期末考试复习题及参考答案
- 矿业有限公司股权转让协议
- 静脉治疗课件
- 社会学理论复习资料
评论
0/150
提交评论