??xml version="1.0" encoding="utf-8" standalone="yes"?>
●AssociateQ关联)(j)Q类之间有关联,通常是作为变量存在;
●Aggregate(聚合)Q类A包含cB或由cBl成Q?/p>
●ComposeQ组合)(j)Q类A是由其他cȝ成;
●DependencyQ依赖)(j)Q类A需要类B的协助,cB变化?x)?jing)响类A,反过来不成立Q?/p>
●GeneralizeQ泛化)(j)Q一般到具体的关p;
●RealizeQ实玎ͼ(j)Q类A实现cBQ?/p>
注意Q其中,聚合Q组成属于关联关p,泛化关系表现为承或实现关系(is a)Q关联关p表Cؓ(f)变量(has a )Q依赖关p表Cؓ(f)函数中的参数(use a)?/p>
1.兌(Associate)
表示Ҏ(gu)Q?头Q实U,头指向被用的c;
pȝ图标Q?img src="http://www.shnenglu.com/images/cppblog_com/api/a.gif" border="0" alt="" width="131" height="18" />
使用说明Q类与类之间的联接,它一个类知道另一个类的属性和Ҏ(gu)Q如下图所C:(x)
2. 聚合关系QAggregationQ?/p>
表示Ҏ(gu)Q空?j)菱形+实线Q空?j)菱形指向整?/p>
pȝ图标Q?img src="http://pic002.cnblogs.com/img/allanbolt/200912/2009122416523521.gif" alt="" style="border: 0px; max-width: 100%; margin: 0px; padding: 0px;" />
使用说明Q聚合关pL整体和个体的关系。下囑ֺ用程序聚合功能模块,但是功能模块可以d应用E序而独立存在,如下图所C:(x)
3. l合关系QCompositionQ?/p>
表示Ҏ(gu)Q实?j)菱形+实线 实心(j)菱Ş指向整体
pȝ图标Q?img src="http://pic002.cnblogs.com/img/allanbolt/200912/2009122416530521.gif" alt="" style="border: 0px; max-width: 100%; margin: 0px; padding: 0px;" />
使用说明Q是兌关系的一U,是比聚合关系强的关系。它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期Q下囑֊能模块组合操作方法,q个操作Ҏ(gu)不能q功能模块单独的存在,功能模块消失后操作方法也随即消失Q?/p>
4. 依赖(Dependency)
表示Ҏ(gu)Q虚U+头 头指向被依赖类Q?/p>
pȝ图标Q?img src="http://pic002.cnblogs.com/img/allanbolt/200912/2009122416534398.gif" alt="" style="border: 0px; max-width: 100%; margin: 0px; padding: 0px;" />
使用说明Q如果类A讉KcB的属性或者方法,或者类A负责实例化类BQ那么可以说cA依赖cB。和兌关系不同Q无dcA中定义类Bcd的属性:(x)
5. 泛化(Generalization)
表示Ҏ(gu)Q实U+三角头 三角头指向一般类Q?/p>
pȝ图标Q?img src="http://pic002.cnblogs.com/img/allanbolt/200912/2009122416540576.gif" alt="" style="border: 0px; max-width: 100%; margin: 0px; padding: 0px;" />
使用说明Q两个类存在泛化的关pL׃用此关系Q例如父和子Q动物和老虎Q植物和qQ在面向对象中,我们一般称之ؓ(f)l承关系Q?/p>
6. 实现(Realization)
表示Ҏ(gu)Q虚U+三角头 三角头指向一般类Q?/p>
pȝ图标Q?img src="http://pic002.cnblogs.com/img/allanbolt/200912/2009122416544554.gif" alt="" style="border: 0px; max-width: 100%; margin: 0px; padding: 0px;" />
使用说明Q类实现?jin)另一个类的功能,一般表现在cȝ承接口上Q如下图Q?/p>
作者:(x)刘(sh) Q发布于Q?012-11-23Q来源:(x)CSDN
在UML 2.0?3U图形中Q类图是使用频率最高的UML图之一。Martin Fowler在其著作《UML Distilled: A Brief Guide to the Standard Object Modeling Language, Third Edition》(《UML_a(b)Q标准对象徏模语a明指南(W?版)(j)》)(j)中有q么一D:(x)“If someone were to come up to you in a dark alley and say, 'Psst, wanna see a UML diagram?' that diagram would probably be a class diagram. The majority of UML diagrams I see are class diagrams.”Q?#8220;如果有h在黑暗的中向你走来ƈ对你_(d)(x)‘嘿,想不想看一张UML图?’那么q张囑־有可能就是一张类图,我所见过的大部分的UMLN是类?#8221;Q,由此可见cd的重要性? cd用于描述pȝ中所包含的类以及(qing)它们之间的相互关p,帮助Z化对pȝ的理解,它是pȝ分析和设计阶D늚重要产物Q也是系l编码和试的重要模型依据?/p> 1. c?/p> c?Class)装?jin)数据和行?f)Q是面向对象的重要组成部分,它是h相同属性、操作、关pȝ对象集合的ȝ。在pȝ中,每个c都h一定的职责Q职责指的是c要完成什么样的功能,要承担什么样的义务。一个类可以有多U职责,设计得好的类一般只有一U职责。在定义cȝ时候,类的职责分解成为类的属性和操作Q即Ҏ(gu)Q。类的属性即cȝ数据职责Q类的操作即cȝ行ؓ(f)职责。设计类是面向对象设计中最重要的组成部分,也是最复杂和最耗时的部分?/p> 在Y件系l运行时Q类被实例化成对象(Object)Q对象对应于某个具体的事物,是类的实?Instance)?/p> cd(Class Diagram)使用出现在系l中的不同类来描q系l的?rn)态结构,它用来描qC同的cM?qing)它们之间的关系?/p> 在系l分析与设计阶段Q类通常可以分ؓ(f)三种Q分别是实体c?Entity Class)、控制类(Control Class)和边界类(Boundary Class)Q下面对q三U类加以要说明:(x) (1) 实体c:(x)实体cd应系l需求中的每个实体,它们通常需要保存在怹存储体中Q一般用数据库表或文g来记录,实体cL包括存储和传递数据的c,q包括操作数据的cR实体类来源于需求说明中的名词,如学生、商品等?/p> (2) 控制c:(x)控制cȝ于体现应用程序的执行逻辑Q提供相应的业务操作Q将控制cL象出来可以降低界面和数据库之间的耦合度。控制类一般是由动宄构的短语Q动?名词Q{化来的名词,如增加商品对应有一个商品增加类Q注册对应有一个用h册类{?/p> (3) 边界c:(x)边界cȝ于对外部用户与系l之间的交互对象q行抽象Q主要包括界面类Q如对话框、窗口、菜单等?/p> 在面向对象分析和设计的初U阶D,通常首先识别出实体类Q绘制初始类图,此时的类图也可称为领域模型,包括实体cd(qing)其它们之间的怺关系?/p> 2. cȝUML囄 在UML中,cM用包含类名、属性和操作且带有分隔线的长方Ş来表C,如定义一个Employeec,它包含属性name、age和emailQ以?qing)操作modifyInfo()Q在UMLcd中该cd?所C:(x) ? cȝUML囄 ?对应的Java代码片段如下Q?/p>
在UMLcd中,cM般由三部分组成:(x) (1) W一部分是类名:(x)每个c都必须有一个名字,cd是一个字W串?/p> (2) W二部分是类的属?Attributes)Q属性是指类的性质Q即cȝ成员变量。一个类可以有Q意多个属性,也可以没有属?/p> UML规定属性的表示方式为:(x) 可见?名称:cd [ = ~省?] 其中Q?/p>
(3) W三部分是类的操?Operations)Q操作是cȝL一个实例对象都可以使用的行为,是类的成员方法?/p> UML规定操作的表C方式ؓ(f)Q?/p> 可见?名称(参数列表) [ : q回cd] 其中Q?/p>
在类?中,操作method1的可见性ؓ(f)public(+)Q带入了(jin)一个Objectcd的参数parQ返回gؓ(f)I?void)Q操作method2的可见性ؓ(f)protected(#)Q无参数Q返回gؓ(f)StringcdQ操作method3的可见性ؓ(f)private(-)Q包含两个参敎ͼ其中一个参Cؓ(f)intcdQ另一个ؓ(f)int[]cdQ返回gؓ(f)intcd?/p> ? cd操作说明C意?/p> ׃在Java语言中允许出现内部类Q因此可能会(x)出现包含四个部分的类图,如图3所C:(x) ? 包含内部cȝcd cMcM间的关系Q?Q?/p> 在Y件系l中Q类q不是孤立存在的Q类与类之间存在各种关系Q对于不同类型的关系QUML提供?jin)不同的表示方式?/p> 1. 兌关系 兌(Association)关系是类与类之间最常用的一U关p,它是一U结构化关系Q用于表CZcd象与另一cd象之间有联系Q如汽R和轮胎、师傅和徒弟、班U和学生{等。在UMLcd中,用实U连接有兌关系的对象所对应的类Q在使用Java、C#和C++{编E语a实现兌关系Ӟ通常一个类的对象作为另一个类的成员变量。在使用cd表示兌关系时可以在兌U上标注角色名,一般用一个表CZ者之间关pȝ动词或者名词表C色名Q有时该名词为实例对象名Q,关系的两端代表两U不同的角色Q因此在一个关联关pM可以包含两个角色名,角色名不是必ȝQ可以根据需要增加,其目的是使类之间的关pL加明?/p> 如在一个登录界面类LoginForm中包含一个JButtoncd的注册按钮loginButtonQ它们之间可以表CZؓ(f)兌关系Q代码实现时可以在LoginForm中定义一个名为loginButton的属性对象,其类型ؓ(f)JButton。如?所C:(x) ? 兌关系实例 ?对应的Java代码片段如下Q?/p>
在UML中,兌关系通常又包含如下几UŞ式:(x) (1) 双向兌 默认情况下,兌是双向的。例如:(x)֮(Customer)购买商品(Product)q拥有商品,反之Q卖出的商品L某个֮与之相关联。因此,CustomercdProductcM间具有双向关联关p,如图2所C:(x) ? 双向兌实例 ?对应的Java代码片段如下Q?/p>
(2) 单向兌 cȝ兌关系也可以是单向的,单向兌用带头的实U表C。例如:(x)֮(Customer)拥有地址(Address)Q则C(j)ustomercMAddresscd有单向关联关p,如图3所C:(x) ? 单向兌实例 ?对应的Java代码片段如下Q?/p>
(3) 自关?/strong> 在系l中可能?x)存在一些类的属性对象类型ؓ(f)该类本nQ这U特D的兌关系UCؓ(f)自关联。例如:(x)一个节点类(Node)的成员又是节点Nodecd的对象,如图4所C:(x) ? 自关联实?/p> ?对应的Java代码片段如下Q?/p>
(4) 多重性关?/strong> 多重性关联关pdUCؓ(f)重数?Multiplicity)兌关系Q表CZ个关联对象在数量上的对应关系。在UML中,对象之间的多重性可以直接在兌直线上用一个数字或一个数字范围表C?/p> 对象之间可以存在多种多重性关联关p,常见的多重性表C方式如?所C:(x) ? 多重性表C方式列?/p>
例如Q一个界?Form)可以拥有零个或多个按?Button)Q但是一个按钮只能属于一个界面,因此Q一个Formcȝ对象可以与零个或多个Buttoncȝ对象相关联,但一个Buttoncȝ对象只能与一个Formcȝ对象兌Q如?所C:(x) ? 多重性关联实?/p> ?对应的Java代码片段如下Q?/p>
(5) 聚合关系 聚合(Aggregation)关系表示整体与部分的关系。在聚合关系中,成员对象是整体对象的一部分Q但是成员对象可以脱L体对象独立存在。在UML中,聚合关系用带I心(j)菱Ş的直U表C。例如:(x)汽R发动?Engine)是汽?Car)的组成部分,但是汽R发动机可以独立存在,因此Q汽车和发动机是聚合关系Q如?所C:(x) ? 聚合关系实例 在代码实现聚合关pLQ成员对象通常作ؓ(f)构造方法、SetterҎ(gu)或业务方法的参数注入到整体对象中Q图6对应的Java代码片段如下Q?/p>
(6) l合关系 l合(Composition)关系也表C类之间整体和部分的关系Q但是在l合关系中整体对象可以控制成员对象的生命周期Q一旦整体对象不存在Q成员对象也不存在Q成员对象与整体对象之间h同生共死的关pR在UML中,l合关系用带实心(j)菱Ş的直U表C。例如:(x)人的?Head)与嘴?Mouth)Q嘴巴是头的l成部分之一Q而且如果头没?jin),嘴巴也就没?jin)Q因此头和嘴巴是l合关系Q如?所C:(x) ? l合关系实例 在代码实现组合关pLQ通常在整体类的构造方法中直接实例化成员类Q图7对应的Java代码片段如下Q?/p>
cMcM间的关系Q?Q?/p> 2. 依赖关系 依赖(Dependency)关系是一U用关p,特定事物的改变有可能?x)?jing)响到使用该事物的其他事物Q在需要表CZ个事物用另一个事物时使用依赖关系。大多数情况下,依赖关系体现在某个类的方法用另一个类的对象作为参数。在UML中,依赖关系用带头的虚U表C,׃赖的一Ҏ(gu)向被依赖的一斏V例如:(x)N员开车,在Drivercȝdrive()Ҏ(gu)中将Carcd的对象car作ؓ(f)一个参C递,以便在drive()Ҏ(gu)中能够调用car的move()Ҏ(gu)Q且N员的drive()Ҏ(gu)依赖车的move()Ҏ(gu)Q因此类Driver依赖cCarQ如?所C:(x) ? 依赖关系实例 在系l实施阶D,依赖关系通常通过三种方式来实玎ͼW一U也是最常用的一U方式是如图1所C的一个类的对象作为另一个类中方法的参数Q第二种方式是在一个类的方法中另一个类的对象作为其局部变量,W三U方式是在一个类的方法中调用另一个类的静(rn)态方法。图1对应的Java代码片段如下Q?/p>
3. 泛化关系 泛化(Generalization)关系也就是承关p,用于描述父类与子cM间的关系Q父cdUC基类或超c,子类又称作派生类。在UML中,泛化关系用带I心(j)三角形的直线来表C。在代码实现Ӟ我们使用面向对象的承机制来实现泛化关系Q如在Java语言中用extends关键字、在C++/C#中用冒?#8220;Q?#8221;来实现。例如:(x)StudentcdTeacherc都是Personcȝ子类QStudentcdTeachercȝ承了(jin)Personcȝ属性和Ҏ(gu)QPersoncȝ属性包含姓?name)和年?age)Q每一个Student和Teacher也都hq两个属性,另外Studentcd加了(jin)属性学?studentNo)QTeachercd加了(jin)属性教师编?teacherNo)QPersoncȝҎ(gu)包括行走move()和说话say()QStudentcdTeachercȝ承了(jin)q两个方法,而且Studentc还新增Ҏ(gu)study()QTeacherc还新增Ҏ(gu)teach()。如?所C:(x) ? 泛化关系实例 ?对应的Java代码片段如下Q?/p>
4. 接口与实现关p?/p> 在很多面向对象语a中都引入?jin)接口的概念Q如Java、C#{,在接口中Q通常没有属性,而且所有的操作都是抽象的,只有操作的声明,没有操作的实现。UML中用与类的表C法cM的方式表C接口,如图3所C:(x) ? 接口的UML囄 接口之间也可以有与类之间关系cM的承关pd依赖关系Q但是接口和cM间还存在一U实?Realization)关系Q在q种关系中,cdC(jin)接口Q类中的操作实现?jin)接口中所声明的操作。在UML中,cM接口之间的实现关pȝ带空?j)三角Ş的虚U来表示。例如:(x)定义?jin)一个交通工h口VehicleQ包含一个抽象操作move()Q在cShip和类Car中都实现?jin)该move()操作Q不q具体的实现l节会(x)不一P如图4所C:(x) ? 实现关系实例 实现关系在编E实现时Q不同的面向对象语言也提供了(jin)不同的语法,如在Java语言中用implements关键字,而在C++/C#中用冒?#8220;Q?#8221;来实现。图4对应的Java代码片段如下Q?/p>
实例分析1——d模块 某基于C/S的即时聊天系l登录模块功能描q如下:(x) 用户通过d界面(LoginForm)输入账号和密码,pȝ输入的账号和密码与存储在数据库(User)表中的用户信息进行比较,验证用户输入是否正确Q如果输入正则q入ȝ?MainForm)Q否则提C?#8220;输入错误”?/p> Ҏ(gu)以上描述l制初始cd?/p> 参考解x(chng)案:(x) 参考类囑֦下:(x) 考虑到系l扩展性,在本实例中引入了(jin)抽象数据讉K接口IUserDAOQ再具体数据访问对象注入到业务逻辑对象中,可通过配置文gQ如XML文gQ等方式来实玎ͼ具体的数据讉Kcȝ名存储在配置文g中,如果需要更换新的具体数据访问对象,只需修改配置文g卛_Q原有程序代码无dM修改?/p> c说明:(x)
Ҏ(gu)说明Q?/p>
实例分析2——注册模块 某基于Java语言的C/S软g需要提供注册功能,该功能简要描q如下:(x) 用户通过注册界面(RegisterForm)输入个h信息Q用L(fng)?#8220;注册”按钮后将输入的信息通过一个封装用戯入数据的对象(UserDTO)传递给操作数据库的数据讉Kc,Z(jin)提高pȝ的扩展性,针对不同的数据库可能需要提供不同的数据讉Kc,因此提供?jin)数据访问类接口Q如IUserDAOQ每一个具体数据访问类都是某一个数据访问类接口的实现类Q如OracleUserDAO是一个专门用于访问Oracle数据库的数据讉KcR?/p> Ҏ(gu)以上描述l制cd。ؓ(f)?jin)简化类图,个h信息仅包括̎?userAccount)和密?userPassword)Q且界面cL需涉及(qing)界面l节元素?/p> 参考解x(chng)案:(x) 在以上功能说明中Q可以分析出该系l包括三个类和一个接口,q三个类分别是注册界面类RegisterForm、用h据传输类UserDTO、Oracle用户数据讉KcOracleUserDAOQ接口是抽象用户数据讉K接口IUserDAO。它们之间的关系如下Q?/p> (1) 在RegisterForm中需要用UserDTOcM输数据且需要用数据访问类来操作数据库Q因此RegisterForm与UserDTO和IUserDAO之间存在兌关系Q在RegisterForm中可以直接实例化UserDTOQ因此它们之间可以用组合关联?/p> (2) ׃数据库类型需要灵zL换,因此在RegisterForm中不能直接实例化IUserDAO的子c,可以针对接口IUserDAO~程Q再通过注入的方式传入一个IUserDAO接口的子cd象(在本书后l章节中学?fn)如何具体实玎ͼ?j)Q因此RegisterForm和IUserDAO之间h聚合兌关系?/p> (3) OracleUserDAO是实C(jin)IUserDAO接口的子c,因此它们之间hcM接口的实现关pR?/p> (4) 在声明IUserDAO接口的增加用户信息方法addUser()Ӟ需要将在界面类中实例化的UserDTO对象作ؓ(f)参数传递进来,然后取出装在UserDTO对象中的数据插入数据库,因此addUser()Ҏ(gu)的函数原型可以定义ؓ(f)Qpublic boolean addUser(UserDTO user)Q在IUserDAO的方法addUser()中将UserDTOcd的对象作为参敎ͼ故IUserDAO与UserDTO存在依赖关系?/p> 通过以上分析Q该实例参考类囑֦?所C:(x) ? 注册功能参考类?/p> 注意Q在l制cd或其他UML囑ŞӞ可以通过注释(Comment)来对图中的符h元素q行一些附加说明,如果需要详l说明类图中的某一Ҏ(gu)的功能或者实现过E,可以使用如图2所CC方式:(x) ? cd注释实例 实例分析3——售票机控制程?/p> 某运输公司决定ؓ(f)新的售票机开发R销售的控制软g。图Il出?jin)售机的面板示意图以?qing)相关的控刉件?/p> 图I 售票机面板示意图 售票机相关部件的作用如下所qͼ(x) (1) 目的地键盘用来输入行E目的地的代码(例如Q?00表示ȝQ?/p> (2) 乘客可以通过车票键盘选择车票U类Q单E票、多ơ往q票和席种c)(j)?/p> (3) l箋(hu)/取消键盘?sh)的取消按钮用于取消购票q程Ql按钮允怹客连l购买多张票?/p> (4) 昄屏显C所有的pȝ输出和用hCZ息?/p> (5) 插卡口接受MCardQ现金卡Q,币口和U币槽接受现金?/p> (6) 打印机用于输?gu)R?/p> (7) 所有部件均可实现自(g)q恢复到初始状态?/p> 现采用面向对象方法开发该pȝQ用UMLq行建模Q绘制该pȝ的初始类图?/p> 参考解x(chng)案:(x) 参考类囑֦下:(x) c说明:(x)
Ҏ(gu)说明Q?/p>
|
兌关系 (association)Q?/p>
(1)兌关系是类与类之间的联l,它一个类知道另一个类的属性和Ҏ(gu)?br> (2)兌可以是双向的Q也可以是单向的。双向的兌可以有两个箭头或者没有箭_(d)单向的关联有一个箭头?br> (3)?Java ?c++ 中,兌关系是通过使用成员变量来实现的?class 徒弟
{ };
class 唐僧
{
protected:
list<徒弟> tdlist;
};
聚合关系 (aggregation)Q?/p>
1、聚合关pL兌关系的一U,是强的关联关pR?br> 2、聚合是整体和部分之间的关系Q例如汽车由引擎、轮胎以?qing)其它零件组成?br> 3、聚合关pM是通过成员变量来实现的。但是,兌关系所涉及(qing)的两个类处在同一个层ơ上Q而聚合关pMQ两个类处于不同的层ơ上Q一个代表整体,一个代表部分?br> 4、关联与聚合仅仅?Java ?C++ 语法上是无法分L的,必须考察所涉及(qing)的类之间的逻辑关系?br> class 引擎
{
};
class 轮胎
{
};
class 汽R
{
protected:
引擎 engine;
轮胎 tyre[4];
};
合成关系 (composition)Q?/p>
1、合成关pL兌关系的一U,是比聚合关系q要强的关系?br> 2、它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期?br> 1 class ?
{
};
class ?
{
protected:
?limb[4];
};
依赖关系 (dependency)Q?/p> 1、依赖关pM是类与类之间的联l?br> 2、依赖L单向的?br> 3、依赖关pd Java ?C++ 语言中体Cؓ(f)局部变量、方法的参数或者对?rn)态方法的调用?br>
昄代码打印
public class Person