【文档说明】Java面向对象程序设计(第2版)第17章课件.ppt,共(65)页,1.871 MB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44832.html
以下为本文档部分文字说明:
统一建模语言UMLUML模型系统体系结构UML:UnifiedModelingLanguageUnified:BoochRumbaughJacobsonUML由世界著名的面向对象技术专家G.Booch、J.Rumbaugh、I.Jacobson发起,在Booch方法,OMT方
法和OOSE方法基础上,广泛征求意见,汲众家之长,几经修改而完成的。1997年被OMG(ObjectManagementGroup)采纳为业界标准。Modeling:建模UML用于建模,即表达模型设计,而且自身拥有四层体系结构。模型是系统一个抽象的概
括,强调系统设计特定的重要方面,同时忽略大量底层的编程细节。而建模就是为了捕捉、描述系统的核心。同一研究对象不同人建立的模型可能同样好或同样差。建模的益处:理解和认识系统的结构和行为,掌握系统的本质特征。在创建系统之间,了解
系统的风险并进行化解。是开发团队沟通的重要形式,为使用系统的人提供帮助。Language:是一种可视化建模语言,有语法和语义,消除了自然语言的歧义。虽然与具体面向对象语言无关,但学会UML的关键之处是将UML模型与具体代码实现相互结合;UML
modelSourcecodeObjectstructuresExecutingprogramUMLProgramminglanguageAbstractviewofAbstractviewofSpecifiesSpecifies模型与代码之间的关系四层元模型体系结构Run-tim
eInstance运行实例层Model模型层Metamodel元模型层Metametamodel元元模型层Classperson1:PersonPersonToolAssociation<<instanceof>><<instanceof>><
<instanceof>><<instanceof>>InfrastructureLibrary::Core::Constructs::ClassInfrastructureLibrary::Core::Abstraction::Relationships<<instanceof
>><<instanceof>>规定元模型的语言规定模型的语言定义描述语义域的语言UML的主要特点:建模设计上的标准化与可视化的结合建模设计上的语言无关性。建模设计上标准性与扩展性的统一。使用UML的CASE(Comput
er-AssistedSoftwareEngineering)工具RationalRosePowerDesignerCASE工具的功能构造模型并进行详细说明,可以检查模型语法正确与否。正向工程(生成数据结构、代码、文档)和逆向工程(代码生成模型)便于团队对模型的共享访问、安全管理、交
流(共享相同概念)对模型文档的版本进行识别、存储和管理UML视图(View):描述软件系统的不同方面所关心视图客户用例视图分析者用例视图、逻辑视图设计者用例视图、逻辑视图、构件视图开发者用例视图、逻辑
视图、构件视图、进程视图、部署视图测试者用例视图、部署视图系统集成者进程视图、部署视图逻辑视图构件视图进程视图部署视图用例视图结构视域实现视域行为视域环境视域用户视域4+1视图模型不同开发者对视图的关心角度UML图(Diagram):用于描述模型,是模型元素的一个
集合单元。用例图:需求捕获类图:类及类之间的相互关系对象图:对象以及对象之间的相互关系构件图:构件及其相互依赖关系部署图:构件在各节点上的部署顺序图:强调对象时间顺序的交互协作图:强调对象协作的交互状态图:类所经历
的各种状态活动图:对工作流程建模结构行为敏捷软件原则:需要时再添加UML的主要图类型活动图用例图协作图对象图类图状态图序列图WorkflowScenariosInter-classbehaviorInter-cla
ssbehaviorStructureStructureInteractionequencebetweenobjectsUML图在设计过程中的演化关系发现类方法:名词短语;公共类;用例导出;CRC(类、职责、协作)提炼类方法:系统范围内;清晰目的;不能孤立;有属性;类
功能单一;Association&GeneralizationStructureTypeDiagram用例模型图用例图静态模型图(状态模型)类图、对象图、构件图、配置图、包图动态模型图行为模型交互图顺序图协作图(通信图)活动图状态变化
模型状态图UML图的类型划分UML视图与图对应关系图视图主要概念UsecasediagramUsecaseview用例、参与者、关联关系、扩展关系、包含关系、泛化关系ObjectdiagramUsecaseand
logicview对象、链接关系SequencediagramUsecaseandlogicview对象、消息CollaborationdiagramUsecaseandlogicview类元、链接关系、消息ActivitydiagramUsecasean
dlogicview活动、迁移、起始活动、终止活动、分支与合并、分叉与汇合Classdiagramlogicview类、关联关系、聚合关系、组合关系、泛化关系、依赖关系、接口、包Packagediagramlogicview包、依赖关系、泛化关系Statediagramlogicview状态、迁移
、起始状态、终止状态、判定ComponentdiagramComponentview构件、接口、依赖关系DeploymentdiagramDeploymentview节点、构件、依赖关系、关联关系<<include>>BA<<extend>>BA
UsecaseBA用例图主要模型元素及其含义参与者(角色)用例包含关系扩展关系关联关系泛化关系参与者是针对用例所扮演的角色,可以人也可以是事物。用例是功能,功能是完整的、外部可见的、相互独立的。完整含义:用例的执行逻辑必须完整,即有主要执行的流程,也有各
种次要流程和意外处理流程。外部可见的:不是内部功能,是参与者可以感知的。相互独立的:用例开始执行到最终结束不依赖于其他用例是参与者和用例之间的通信渠道,如果没有箭头,则代表通信是双向的。是用例与用例的一种依赖关系:它允许被包含用例中的公共行为从包含用例中分解出来。如B用例包含A用例,则意味
着B用例要执行,必须先执行A用例。是用例与用例的关系:B用例扩展A用例,表示A用例在某种条件满足下,可以执行B用例。因而B用例是A用例的额外功能;另外当B用例的执行可以由A用例而来,也可以由其他途径而来时(没有包含那种强制含义),B用例和A用例也是一种扩
展关系。是用例与用例、参与者与参与者之间的一种继承关系,表示一个用例(角色)将继承另一用例(角色)的所有功能(语义含义)。Actor_1Actor_2Actor用例图是对需求中系统功能的规格说明(不对
系统约束进行说明),并被作为验收测试的依据。用例图模型的建立过程:确定参与者和用例;确定参与者与用例之间的关系,确定参与者之间的关系,确定用例之间的关系;确定需求边界,在用例图中用矩形框表示;对用例功能进行描述,形成文档。【例】包含二个角色
,四个用例。其中B用例和A用例之间的关系为包含,即B用例执行前必须先执行A用例;C和A的关系为扩展,即A用例在某种条件满足下,可以扩展出C用例;D用例和A用例的关系为继承,表明D将拥有A用例的所有功能。参与者1和参与者2之间的关系为继承,表示参与者2除了可以驱动A、B用例外,还可以驱动参与
者1的所有用例,即图中的D用例。<<extend>><<include>>Actor_1ACBDActor_2用例规格说明格式用例说明要素说明简要描述概述参与者涉及的参与者前置条件用例开始所需的条件主事件流对正常事件的流程进行描述备选流定义异常事件后置
条件用例结束后的系统状态表示类及其关联关系的图+display()-getNumOpenSlots()+setStatus()+numCanisters:int-numWafers:int-size:floatCanister类名属性操作+:可见-:不可见类图长短式;抽
象类和具体类表示;类多重性表示;封装表示操作属性:类型类名*University1Component主要的模型元素:类、关联、泛化、依赖关系、接口、包。类中属性和操作的类范围和对象范围+Canister()+display()-getNumOpenSlots()+setStatus()+nu
mCanisters:int-numWafers:int-size:floatCanister静态属性构造方法静态方法此三者专属于类,其他属性和方法虽然在类中定义,实际为对象而服务。对象图为类图实例,是类图的一个快照对象图长式属性=值对象名:类名对象名
:类名短式类图对象图类具有3个分栏:名称、属性和操作对象只有两个分栏:名称和属性类的名称栏只有类名对象名称栏为:“对项目:类名”或“:类名”类的属性分栏定义了所有属性的特征定义了属性的当前值类中列出了操作不包含操作,因为对象所有操作相同类图是对象图的抽象,类有关联,关联是对象图中链
接的抽象,类图中的关联有名称、角色、多重性以及约束等。对象图是类图的一个实例,对象有链接,链接是关联的实例,链接有名称、角色,但没有多重性。类图和对象图的比较类是数据类型,UML在表示所有语言数据类型上不够;用
构造型(stereotype)进行数据类型(模型元素)的扩展。<<type>>Integer基本int数据类型<<interface>>MyInterfaceJava语言的接口Color<<enumration>>redgreenblue用户自定义枚举类型泛化:抽象类与继承关系的UML表示
泛化构造型:<<implementation>>、<<realize>>抽象类在编程上的可替换(Interchageable)与多态性CurrentAccountDepositAccountOnlineAccountA
ccountgetBalance()Accountac;ac=newCurrentAccount();System.out.println(ac.getBalance());ac=newDepositAccount();System.out.println(ac.getBalance(
));……可替换性多态性关联(一):关联名、关联方向、关联角色、关联多重性classPerson{Componyemployer;.....}classCompany{Person[]employee;.....}类A类B角色a角色b关联名关联多重性关联多重性PersonCompan
yemployeeemployerWorksFor0..*0..1关联(二)实现:类图为关联,对象图为链接,代码实现为引用;类图中的关联关系将决定对象图、序列图中对象的交互关系PersonCompanyemployeeemployerWorksFor0..*1john:PersonI
CI:CompanyWorksFortom:PersonWorksFor用代码表示类图多重性含义(一)classA{Bb;.....}classB{Aa;.....}A、B两个类对象可以引用对方也可以不引用,总之可自由选择;0..1a0..1bAB用代码
表示类图多重性含义(二)A类对象必须引用B类对象,B类对象则可以引用也可以不引用A对象classA{Bb;A(B_b){if(_b==null){//throwNullLinkError}b=_b;}}
classB{Aa;.....}0..1a1bAB用代码表示类图多重性含义(三)classA{Bb;A(B_b){if(_b==null){//throwNullLinkError}b=_b;b.setA
(this);}}classB{Aa;voidsetA(A_a){if(_a==null){//throwNullLinkError}a=_a;}}先产生B类对象,再产生A类对象,只要A类对象产生时,二者就构成了相互引用;如果产生对象的方式反过来,如法炮制。1a1bAB关联(三):关联的元数(一元
关联或自关联或递归关联、二元关联、三元关联)?对象存在一元链接和三元链接吗ServantheaderclerkManage0..*1header:ServantClerk_n:ServantClerk_1:Servant……供货商顾客销售商***MailMessageAttachment*co
mposition*ComputerProcessor*1aggregation关联(四):聚合(部分是整体的一部分)组合(整体拥有部分)主要概念聚和传递性、非对称性组合传递性、非对称性、依赖性、固定性特征一般关联聚合组合标记实线空心菱形实心菱形拥有无弱强多重性任意任意整体为1传递
性无有传方向无整体与部分关联(五):关联约束约束关键词含义{subset}一个关联是另一个关联的子集{ordered}表示有序对象{changeable}关联可变{addonly}关联可以动态添加,但
不能修改{frozen}关联不能修改{xor}两个关联之间是互斥关系委员会人{subset}*1成员主席主席是成员中的一员:委员会有一个成员的引用集合,有一个“主席引用”,主席对象被“主席引用”引用外,在成员引用集合中也存在一个引用指向
主席对象。多边形线段*{ordered}多边形中存在一个线段的引用集合,多个线段对象的引用是以有序的方式加入集合当中。购房合同人公司{xor}购房合同的主体只能有一个,要么是人,要么是公司。人公司雇主0..1*工人*0..1老板人.雇主=人.老板
.雇主用标记值来表示约束老板:人工人1:人工人2:人A:公司老板:人工人1:人工人2:人A:公司B:公司约束条件下的对象链接图没有约束条件下的可能存在的对象链接关系图关联(六):关联类;产生条件(多重性中的多对多;将对应关系进行存储)ModuleStudent*Registration
Mark:Integer1classRegistration{privateintmark;privateStudentstudent;Registration(Studentst){student=st;mark=0;}}classModule{privateVect
orregistrations=newVector();publicvoidenroll(Studentst){registrations.addElement(newRegistration(st));}}CustomerAcc
ountCurrentAccountDepositAccountOnlineAccountHolds0..11关联(七):关联与类的泛化CustomerCurrentAccountDepositAccountOnlineAccountDire
ctoryFilename0..1classDirectory{privateHashtabletheFiles;.....}关联(八):受限(qualified)关联的表示及实现;name是theFiles中的KeyDirectoryFile*interfaceMyClass
<<implementation>><<interface>>MyInterfaceinterfaceMyInterface....classMyClassimplementsMyInterface{.....}MyClassMyInterface接口表示及实现class
MyDependentClass{.....voidmyFunction1(MyReferencedClassr){...}MyReferencedClassmyFunction2(…){...}voidmyFunc
tion3(…){MyReferencedClassm…}}dependence(referencetoaclass)parameterorreturntypeorlocalvariabletypeMyDependentClassMyReferencedClass依赖的表示
和实现依赖的表示和实现MyClassMyInterfaceUseClassclassUseClass{voidmyFunction(MyInterfacemi){……}}Studentjack:Student<<instanceOf>>包及包图包是UML的模型元素之一,是一种分组机制,把一些
模型元素组织成语义上相关的组。包可以包含类、接口、组件、结点和其他包,包之间有引入、依赖、继承的关系。包图用来描述系统模型的体系结构层次,一个包就是一个子系统,包图是设计中的概念,在建模时起到归类的作用,对于实际系统没有意义,不需要转化成可执行的系统。包
图中涉及到的注解到包名边的构造型主要有:<<system>>系统模型<<subsystem>>子系统模型<<facade>>是其他包的一个访问接口视图包<<stub>>另一个包的代理<<framework>>由模式组成的包Package包名,可含有包路径
——包层次ABDC<<use>><<import>>A包在类定义层次使用了B包继承了D包,在对象层次调用了C包中的对象。顺序图(序列)图顺序图又称为序列图,描述对象之间动态的消息交互关系,体现对象间消息传递的时间顺序。图顶层的水平轴为交互的对象,对象下的虚线代表对象生命线,虚线上的矩
形框表示对象接受消息后被激活期,代表方法的执行,对象间消息交互从图的最顶端开始,自上向下体现的是消息交互的时间顺序。myObject:MyClassmyObject1:MyClass11.1Operation1()Client1Operation()Clien
t端是消息的发送端,拥有myObject的引用Operation()是MyClass的方法,该方法中有myClass1对象的引用Operation1()是MyClass1的方法a是MyClass的声明……a.Operation()b是MyClass1声明……b.Operation1()
交互图中的消息1)消息格式:[序号][条件][重复次数][回送值:=]操作名(参数表)2)消息四种类型:简单消息、同步消息、异步消息和返回消息简单消息同步消息异步消息返回消息消息的类型内部消息的表示方法:A:B<<destroy>><<create>>消息中的构造型3)
内部消息和循环消息表示方法4)消息中的构造型:创建消亡用同步消息,<<create>>、<<destroy>>建立顺序图步骤1.确定交互的类对象2.在序列图左上角画一个矩形框代表该对象,使用UML标记方法:o
bject:Class3.画一个延长矩形框在该对象下面表示一个操作的执行。4.画一个箭头指向右边。myObject:MyClassmyObject1:MyClass1operation1()5.确定那个对象处理该消息。6.用操作
的名称给该箭头命名。7.系统使用一个拉长的矩形框表示一个过程的开始。8.如果是同步消息(方法调用),则接受消息对象被激活的矩形框不要超过发消息对象的矩形框。myObject:MyClass合作图(协作)图用于描述相互合作的对象间的交互关系,模型元素由类元或对象、链接、消息构成。类元角色:
描述对象在交互中扮演的角色winner:Account链接:用实线表示两个类元(对象)之间的链接,用构造型表明链接的种类类型含义全局性(global)表明该链接是由类中关联的实例化局部性(local)表明该链接是操作中的一个局部变量。参数性(parameter)表明该
链接是操作中的传入变量自我性(self)表明该链接是自身发送的消息<<parameter>>1:count(part)1.2:getNumber()a:Assemblyclientpart:CatalogueEntry消息:格式同顺序图:Comp
onent*Client:Assembly1:cost()1.1*:cost():ComponentClient:Assembly1:cost()1.1*:cost()合作图中的循环消息表示法对象的创建与撤销{new}:合作中新产生的对象或链接{destroy}:合作中销
毁的对象或链接{transient}:合作中产生又销毁的对象或链接Client:Orderline:OrderLine{destroy}1:remove(line)1.1:<<destroy>>{destroy}消息构造型链接撤销对象撤销顺序图和合作图的相互转化<<self>>1
:getTotal()1.2.1:getLocation()1.1*:getValue()1.2:getShipping():Orderclient:Customer:OrderLine:OrderLine*getLocation()get
ShippingCost()*getValue()getTotal()client:Order:CustomergetLocation()getShippingCost()*getValue()getTotal()活动图活动图用于描述系统需求各用例内活动的执行顺序或类方法中主要活
动的执行流程。活动:活动由子活动或动作构成,动作是不可再分的活动,其执行不能被打断,动作不能象活动那样拥有入口动作、出口动作和内部迁移,活动和动作都拥有相同的UML表示符号。模型元素活动名活动迁移分支与合并开始活动结束活动分
叉汇合迁移:由带箭头的实线表示,表示动作状态的转移,当迁移上无条件时,称为无条件动作流,当有条件时,条件满足迁移发生。分支与合并:一个入迁移,多个具有互斥条件的出迁移,迁移沿判定条件为真的分支迁移;合并:将多个具有互斥条件的入迁移合并成一个出迁移,即当有一个
入迁移发生时,就会引起出迁移。迁移也可以分叉和汇合,分叉形成并发迁移,汇合则对迁移进行同步。开始活动与结束活动:开始活动是活动图的开始,只能有一个,结束活动是活动图的结束,一个活动图可以存在多个结束活动。状态图描述系统或类可能有的不同状态及其引起状态迁移的事件
,对象的状态决定了对象的行为。模型元素迁移条件判定开始状态结束状态状态状态名entry/Action_1do/Action_2exit/Action_3...状态:由状态名和活动组成。在状态图中,状态名唯一;活动是在该状态下执行的事
件和动作,是可选项。每个状态有有入口、执行和出口三个标准事件,每个事件对应一个动作。如果在状态的活动区还画有一个或多个状态图,则称为嵌套状态。迁移:由带箭头的实线表示,表示状态的转移,迁移的完整描述为“事件(参数)[条件]/动作”,迁移可以接判断,判断一入多出,且出迁条件互斥。条
件判断开始状态与结束状态:开始状态是状态图的开始,对于同一层次状态图而言只能有一个(嵌套的状态图可以有自己的开始状态和结束状态),结束状态是状态图的结束,一个状态图可以有多个结束状态。状态图与活动图的相同点和不同点相同点:1)图中的建模元素有相似之处。2)对系统或对
象在生存周期的状态和行为进行描述。不同点:1)状态图中迁移发生时,必须有事件发生或条件满足,而活动图的迁移可以无条件或没有事件发生。2)状态图对于系统状态的描述可以横跨多个用例,而活动图则是针对同一用例内部的动作执行给出描述。构件图构件图描述构件及其相互依赖关系,用于将系
统逻辑设计与物理模块进行对应。模型元素构件接口依赖Interface构件:相对逻辑设计上的类和对象,构件是和物理系统相关的一个概念,不同的语言对构件的定义有所不同,UML中的构件含义包括代码文件,也指数据库、动态链接库、we
b页面等。依赖:构件中的关系以依赖的形式表达,可分为编译依赖和调用依赖两类。接口:构件和接口存在实现和调用两种关系。ComponentA.javaB.java<<USE>>1A+Operation(B)()...:voi
dB构件构造型:<<document>>、<<executable>>、<<file>>、<<library>>、<<table>>、<<requirement>>构件依赖中使用的含义部署图部署图描述了构件在物
理硬件上的分布情况。模型元素结点构件Component结点关联结点:表示某种计算资源的物理对象,包括计算机、外部设备(打印机、读卡器、通信设备等),结点内部放置构件,表示构件部署在该结点上,同一个结点内部的构件关系用依赖
表达。关联:结点之间的关联表示结点之间物理连接以及其上用的通信协议。依赖部署图中的构造型:用来表达结点通讯使用的协议等。经典案例案例1工厂仓库管理信息管理——需求•1)对仓库每种零件进行编号(数字)•2)对仓库每
种零件类型进行命名(字符)•3)记录每种零件的价格(浮点)•4)零件可以构成组件,组件和零件可进一步构成层次更高的组件•5)需要查询任一组件的价格。publicclassPart{privateStringname;privatelongnumber;privateDo
ublecost;publicPart(String_name,long_numbr,double_cost){name=_name;number=_number;cost=_cost;}publicStringgetName(){returnname;}
publiclonggetNumber(){returnnumber;}publicdoublegetCost(){returncost;}}问题潜在需求:仓库零件非常多,这样设计的问题有:1、对象属性冗余
,造成内存浪费以及维护上的困难。2、仓库中没有零件无法记录零件类型。针对需求NO1-3的设计Part---numbernamecost:long:String:Double+++getName()getNumber()getCost()...:String:long:doub
lepublicclassPart{privateCatalogueEntryentry;publicPart(CatalogueEntrye){entry=e;}}ScrewsBolts上述问题的解决方案publicclassPart
{privateCatalogueEntryentry;publicPart(CatalogueEntrye){entry=e;}publicdoublecost(){returnentry.getcost();}}Part成本查询的相应调整1CatalogueEnt
ry---numbernamecost:long:String:Double+++getName()getNumber()getCost()...:String:long:doublePart-entry:Catalo
gueEntry+cost()...:Double1CatalogueEntry---numbernamecost:long:String:Double+++getName()getNumber()getCost()...:String:long:doublePart-
entry:CatalogueEntryscrew:CatalogueEntrynumbernamecost...=28834=screw=0.02bolts:CatalogueEntrynumbernamecost...=10117=bolt=0.03:Part:Pa
rt:Part:Part:Part1:cost()1.1:0.02:=getCost()screw:CatalogueEntry:Partclient针对需求NO4的设计:组合表示场景描述:p3和p2组
成a2,a2和p1组成a1containcontaincontaincontainscrew:CatalogueEntrynumbernamecost...=28834=screw=0.02bolts:CatalogueEn
trynumbernamecost...=10117=bolt=0.03a1:Assemblya2:Assemblyp1:Partp2:Partp3:Part潜在需求:一个assembly可以对应多个part或assembly。设计要求:引用上存在多样性现象。Vector链表中的每个单
元可引用任何对象,因而Assembly或Part的引用都可以放入。但组合物中加入构件时有两种方案,很明显方案2较好。publicclassAssembly{privateVectorcomponents=newVector();publicvo
idaddAssemble(Assemblyc){components.add(c);}publicvoidaddPart(Partc){components.add(c);}publicvoidadd(Objectc){components.add(c);}}方案1方案2多样性0.
.*0..*Part1Assembly上图中的组合关系又可以表示如下:为解决“黑洞”问题,同时也为了Vector中组成对象能用一致的接口进行调用,Assembly以及Part必须具有后天的“血缘”关系(而不是天然的Object的“血缘”关系)。
因而Object的角色最好由自定义的抽象类Component充当,它有一个抽象接口方法cost()。类图语义:凡是Object的子类都可加入Assembly当中。但这样设计后,加入Assembly当中的对象都失去原来的特征,只剩Object的特征,且因为集合结构Vector中对象
引用多样性,无法进行准确还原,好似“黑洞”。针对需求NO5的设计:组合物成本查询0..*Part-entry:CatalogueEntry+cost()...:DoubleAssembly-components:Vector++add(Componentc)cost()...:void:Doub
leComponent{abstract}+cost()...:Double1.1.1getCost()1.2:cost()1.2.1:cost()1.2.2:cost()1.2.1.1:getCost()1.2.2.1:getCost()1.1:cost()screw:Catalo
gueEntrynumbernamecost...=28834=screw=0.02bolts:CatalogueEntrynumbernamecost...=10117=bolt=0.03Clienta1:Assemblya2:Assemblyp1
:Partp2:Partp3:Part0..*Part-entry:CatalogueEntry+cost()...:DoubleAssembly-components:Vector+add(Objectc)...:voidObject最终的类图和对应的代码
publicabstractclassComponent{publicabstractDoublecost();}publicclassPartextendsComponent{privateCatalogueEntryentry;publicPart(CatalogueE
ntrye){entry=e;}publicdoublecost(){returnentry.getcost();}}publicclassAssemblyextendsComponent{privateVectorcomponents=newVecto
r();publicvoidadd(Componentc){components.add(c);}publicDoublecost(){doubletotal=0.0;Enumerationenum=components.elements()
;while(enum.hasMoreElements()){total+=((Component)enum.nextElement()).cost();}returntotal;}}遍历动态绑定,发
统一消息抽象类的定义保证了cost()接口在子类定义和对象调用中的一致性强制类型转化用统一的Component的视角看待所有子类对象0..*1CatalogueEntry---numbernamecost:long:Stri
ng:Double+++getName()getNumber()getCost()...:String:long:doublePart-entry:CatalogueEntry+cost()...:DoubleAssembly-components:Vector++add(Compon
entc)cost()...:void:DoubleComponent{abstract}+cost()...:Double案例1总结•1)当对象数量较大时,可以将属性信息放置在另一个对象中并通过引用得到属性信息,有利于降低信息冗余度,便于维护信息。•
2)通过组合方式来创建复杂对象。•3)组合对象和构件对象拥有同一个抽象类,可以保持组合对象和构件对象的接口一致性,便于对象的组装和动态调用。案例2图形编辑器需求图形编辑器用例图图形编辑器界面<<extend>><<extend>><<i
nclude>>创建图形选择图形删除图形创建图层改变图形尺寸移动图形管理图层操作员:1操作员:21)软件初始启动:处于创建长方形的状态;编辑区域默认产生第一个编辑图层;图形编辑提示区域提示为“第一页”。2)创建图形:创建图形用例:用于创建
直线、椭圆、矩形。用户首先选择创建图形的类型,之后将鼠标移至图形编辑区域,按下鼠标确定起始点,之后拖动鼠标,在绘图区域动态绘出相应图形,当鼠标释放时,在起始和终止点所包含的长方形区域内,将图形绘制在当前的图层上。。3)选择图形:主事件流是,对已创
建的图形进行选择,可单选也可多选,选择的图形应标出选中状态。当图形嵌套时,在其内部点击,可按图形创建的先后依次进行选择;备选流:如果要取消当前的选择状态,可在图形编辑层中的任一空白点点击,便可取消原先的所有选择状态。4)删除图形:前置条件为选择要删除的图形,再点击“删除元素
”按钮,可删除选择的所有图形。5)改变图形主事件流是,在选择的图形中点击图形的控制点并移动,进行图形尺寸的改变。备选流:可对图形尺寸直接放大缩小。6)移动图形:主事件流是选择图形之后拖动图形至指定位置;备选流:当整个图形编辑器移动时,编辑
器中所有图形也相应移动。7)创建图层:主事件流是可在图形编辑区域进行新图层的创建,新图层创建后,自动为当前图层,在其上可进行图形创建和管理工作。新图层产生的同时,图形编辑层提示给出编号提示。备选流:如果产生的图层超过16个,则不能再
产生新的图层,同时,图形编辑层提示给出相应的提示信息。后置条件:新图层的处于创建“长方形”状态。8)管理图层:主事件流是可在图形编辑区域针对多个图层进行切换选择,并将选择的图层作为当前层,在其上可进行图形创建和管理工作。切换时,图形编辑层提示给出当前层的编号
提示。备选流:如果当前图层为最后一个图层,则再切换时,当前图层为第一页图层。后置条件:当图层切换时,图层的操作状态重新处于创建“长方形”状态。PanelDiagramEditorControlsButtonChoiceDiagramEditorAppletAppletCanvasTo
olDiagramEditorDiagramCreationToolSeletionToolElementLineToolEllipseToolWrectangleToolEllipseWrectangleLineLabel类图1
1*current1111111*0..1{subset}{subset}selectedtool1resizing<<instantiate>><<instantiate>><<instantiate>>ownscur_o
wnselectcur_select序列图:刷新刷新move(dx,dy)highlight(g)draw(g)draw(g)draw(g)paint(g)repaint()move(p)mouseMove(e,x,y)actor:DiagramEditor:Diagr
am:SelectionTool:Elementmove(dx,dy)highlight(g)draw(g)draw(g)draw(g)paint(g)repaint()move(p)mouseMove(e,x,y)创建图形——以创建矩形为
例创建图形:Diagram或<<create>>r:Wrectangleadd(r)release()mouseUp(e,x,y)move(p)mouseMove(e,x,y)press()mouseDown(e,x
,y)move(p)mouseMove(e,x,y)Actor_1:DiagramEditor:WrectangleToolWrectangle(start,current)add(r)release(
)mouseUp(e,x,y)move(p)mouseMove(e,x,y)press()mouseDown(e,x,y)move(p)mouseMove(e,x,y)序列图:移动图形移动图形contains(curr
ent)press()release()mouseUp(e,x,y)move(dx,dy)move(p)mousMove(e,x,y)select(e)returntrueorfalseelementsmouseDowne,x,y)move(p)mouseMove(e,x,y)Act
or_1:DiagramEditor:SelectionTool:Diagram:Elementcontains(current)press()release()mouseUp(e,x,y)move(dx,dy)mo
ve(p)mousMove(e,x,y)select(e)returntrueorfalseelementsmouseDowne,x,y)move(p)mouseMove(e,x,y)序列图:改变图形尺寸改变图形returntruerelease()mouseUp(e,x,y)move
Control(dx,dy)move(p)mouseMove(e,x,y)findControls(current)press()mouseDown(e,x,y)Actor_1:DiagramEditor:SelectionTo
ol:Elementreturntruerelease()mouseUp(e,x,y)moveControl(dx,dy)move(p)mouseMove(e,x,y)findControls(current)press()mouseDown(e,x,y)状态图选
择图形状态图quitmovepress[onelements]releasepress[oncontrolpoints]releasepress[noelements]releasemovemove/dragcontrolpointmove
/moveselectedelementsLocatingMovingErrorResizing创建图形状态图quitpressreleasemovemoveLocatingStartLocatingStop序列图:删除图形删除图形<<destroy>>
remove(e)unselete(e)delete()deleteElements()Actor_1:DiagramEditor:SelectionTool:Diagram:Element<<destroy>>remove(e)unselete(e)
delete()deleteElements()