UML类图的⼏种关系及对应java代码
zuo在UML类图中,常见的有以下⼏种关系: 依赖(Dependency),关联(Association),泛化(Generalization), 实现(Realization),聚合(Aggregation),组合(Composition)
UML类图中的五种关系的耦合强弱⽐较:依赖<;关联<;实现<;继承<;聚合<;组合
下⾯,我们详细说说每⼀个关系:
⼀、依赖(Dependency)关系
说明:它描述⼀个对象的修改会导致另⼀个对象的修改这样的关系。当表⽰⼀个事物使⽤另⼀个事物时,就运⽤依赖。
可描述为:Use a(使⽤了其他对象)
表⽰:依赖关系是⽤⼀条带箭头的虚线表⽰的
图例:
关系强弱:依赖是类的六种关系中耦合最弱的⼀种关系。
举例:Animal(动物)依赖Oxygen(氧⽓)
类图:
代码体现(对应java代码):
⼀个类的对象作为另⼀个类的⽅法参数传⼊
//氧⽓类作为动物类中某个⽅法的参数
Public class Animal {
Public Metabolism(Oxygen oxygen) {
}
}
uml图例⼆、关联(Association)关系
说明:它描述不同类的对象之间的结构关系,他在⼀段时间内将多个类的实例连接在⼀起。
表⽰:关联关系是⽤⼀条直线(加箭头)表⽰的
关联关系分为单向关联和双向关联。在java中,单向关联表现为:类A当中使⽤了类B,其中类B是作为类A的成员变量。双向关联表现为:类A当中使⽤了类B作为成员变量;同时类B中也使⽤了类A作为成员变量。
图例:
强弱:关联关系⽤实线,表⽰类之间的耦合度⽐依赖强。
举例:Penguin(企鹅)和Climate(⽓候)
类图:
代码体现(对应java代码):
1.⼀个类的对象作为另⼀个类的成员变量传⼊或者返回值
//企鹅类引⽤⽓候对象
Public class Penguin {
private Climate climate;
}
2.⼀个类作为另⼀个类⽅法⾥的局部变量
//⽓候类企鹅类⽅法⾥的局部变量
Public class Penguin {
public void print(){
Climate climate;
}
}
⼩结:
依赖关系VS关联关系
1、从类的属性是否增加的⾓度看
(1)发⽣依赖关系的两个类都不会增加属性。其中的⼀个类作为另⼀个类的⽅法的参数。
(2)发⽣关联关系的两个类,其中的⼀个类成为另⼀个类的属性,⽽属性是⼀种更为紧密的耦合,更为长久的持有关系。
2、从关系的⽣命期⾓度看:
(1)依赖关系是仅当类的⽅法被调⽤时⽽产⽣,伴随着⽅法的结束⽽结束了。
(2)关联关系是当类实例化的时候即产⽣,当类销毁的时候,关系结束。相⽐依赖讲,关联关系的⽣存期更长。
三、泛化(Generalization)关系(也叫继承关系)
说明:泛化关系表⽰⼀个类对⼀个类的继承,继承⽽得的类成为后代,被继承类成为祖先。继承意味着祖先的定义(包括任何特征,如属性、关系或对其对象执⾏的操作)对于后代的对象也是有效的。泛化关系是从后代类到其祖先类的关系。
泛化是⼀般类⽬(称为超类或⽗类)和较特殊的类⽬(成为⼦类或孩⼦类)之间的关系。
表⽰:泛化关系是⽤⼀条带空⼼箭头的直线表⽰的
可描述为:Is a
图例:
举例:Bird(鸟)和Animal(动物)
类图:
代码体现(对应java代码):
//鸟类继承动物类
Public class Bird extend Animal{
}
四、实现(Realization)关系
说明:实现所代表的含义是,基本⽤例描述了⼀个业务⽬标,但是该业务⽬标有多种可能的实现途径,每⼀种实现途径可以⽤⽤例实现(或称⽤例实例)来表⽰,⽽⽤例实现与基本⽤例之间就构成了实现关系
表⽰:实现关系是⽤⼀条带空⼼箭头的虚线表⽰的
图例:
举例:Bird(鸟)和Animal(动物)
类图:
代码体现(对应java代码):
//⼤雁实现飞翔接⼝
Public class WideGoose impment IFly{
}
⼩结:泛化关系VS实现关系
五、聚合(Aggregation)关系
说明:聚合关系⽤于类图,特别⽤于表⽰实体对象之间的关系,表达整体由部分构成的语义。
在 UML 模型中,聚集关系显⽰⼀个类元是另⼀个类元的⼀部分或者从属于另⼀个类元。
聚集是⼀种特殊类型的关联,在这种关联中,各个对象组装或配置在⼀起以创建更复杂的对象。聚集描述了⼀组对象以及您如何与它们进⾏交互。聚集通过在表⽰组装的对象中定义称为聚集的单个控制点来保护对象的组装完整性。聚集还使⽤控制对象来决定组装对象如何对可能会影响集合的更改或指令作出响应。
可描述为:Has a
表⽰:实现关系是⽤⼀条带空⼼菱形的直线表⽰的
图例:
强弱:类之间的耦合度⽐组合弱。
举例:WideGooseAggregate(雁)和WideGoose(⼤雁)类图:
代码体现(对应java代码):
在成员变量⾥⼀对多的关系
//⼤雁作为成员变量传⼊雁类
Public class WideGooseAggregate{
List<WideGoose> wideGooses
}
作为构造⽅法的参数传⼊ ,参数在其他地⽅实例化
//Context类
Public class Context{
private State state;
Public Context(State state) {
this.state= state;
}
}
//客户端
public class Client {
public static void main(String[] args) {
Context c=new Context(new ConcreteStateA());
}
}
五、组合(Composition)关系
说明:组合关系⽤于类图, 特别⽤于表⽰实体对象关系,表达整体拥有部分的语义。
组合关系是⼀种强依赖的特殊聚合关系,体现了严格的部分与整体的关系,如果整体不存在了,则部分也将消亡,部分和整体的⽣命周期⼀样。
在 UML 模型中,聚集关系显⽰⼀个类元是另⼀个类元的⼀部分或者从属于另⼀个类元。
组合关系表⽰整体与部分的关系,并且是⼀种聚集形式。组合关系指定部分类元的⽣存期取决于完整类元的⽣存期。
可描述为:Contains a
表⽰:实现关系是⽤⼀条带实⼼菱形的直线表⽰的
图例:
强弱:类之间的耦合度⽐聚合强。
举例:Bird(鸟)和Wing(翅膀)
类图:
代码体现(对应java代码):
在构造函数⾥⼀对多的关系
//在鸟Bird类中,初始化时,实例化翅膀Wing,他们之间⽣命周期⼀样
Public class Bird{
private Wing wing;
Public Bird(){
wing=New Wing();
}
⼩结:组合关系VS聚合关系
1、构造函数的⾓度
聚合类的构造函数中包含了另⼀个类作为参数。 雁类(GooseGroup)的构 造函数中要⽤到⼤雁(Goose)作为参数传递进来。⼤雁类(Goose)可以脱离雁类⽽独⽴存在。
组合类的构造函数中包含了另⼀个类的实例化。 表明鸟类在实例化之前,⼀定要先实例化翅膀类(Wings),这两个类紧密的耦合在⼀起,同⽣共灭。鸟类(Bird)是不可以脱离翅膀类(Wings)⽽独⽴存在。
2、信息的封装性⾓度
在聚合关系中,客户端可以同时了解雁类和⼤雁类,因为他们都是独⽴的。
在组合关系中,客户端可以只认识鸟类,根本就不知道翅膀类的存在,因为翅膀类被严密的封装在鸟类中。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论