UML基础之关系
UML是统一建模语言([Unifried Modeling Language][6])的缩写。最初用于描述复杂的软件和非软件系统的行为。UML伴随着面向对象的概念和方法而生。它本身不是一种编程语言,但通过构建UML图能够帮助我们很轻松地使用各种语言编写实际代码(基本在面向对象语言中使用如:java,c++,C#)。
面向对象的一些核心概念:
- 对象
- 类
- 抽象
- 封装
- 继承
- 多态
它定义了一种能够具有多种形式的机制。基本上有两种类型的多态 性:编译时(也就是早期绑定)和运行时(后期绑定)。
在编译时多态性中,对象在编译时知道要实现多态性。函数重载是在编译时实现的多态性。编写重载方法时应该使用相同的名称和不同的参数。如:对两个或者三个数字进行加法(sum)运算,而参数的数量由用户调用时根据需要传递,这样程序员就需要创建2个同样为sum的方法,带有2个或者3个参数。
在运行时多态性中,对象本身不知道在编译时需要实现多态性,而是在运行时需要实现相应的属性和方法。是通过对父类函数重写或者说基于继承的多态性来实现的。
关系
关系是UML中非常重要的构造块,显示元素之间是如何相互关联的,这种元素之间的联系也能反映软件应用的整体功能。主要包含以下不同种类的关系。(这是我用visio画的4种关系图表示:复合即组合)
依赖
依赖关系定义了不同对象之间相互影响的关系。它描述了依赖的对象和依赖关系的方向。
依赖关系描述的主要内容是当两个元素之中的一个发生变化,另外一个也会相应的发生变化。由如上图所示虚箭头表示。关联
关联关系描述了UML图中元素的关联方式。简单的说,描述了多少个元素正在参与。关联关系在类之间通过一个指向关联方向的箭头表示。如果两端都是则是双向关联。
//Test与Bar类存在关联关系
public class Test{
public void doSomething(){
System.out.println(Bar.doSomething());
}
}
//Message类和Person类存在关联关系
public class Message{
private Person per;
public Message(Person per){
this.per=per;
}
}
依赖关系和关联关系的区别?
当我们将对某个类的引用作为当前类特定操作和函数的一部分时,通常会使用依赖关系。使用依赖关系时,你需要意识到依赖关系中会调用引用类中的某个API,而且对引用类的任何修改必然会破坏当前类。依赖关系是由依赖类开始到独立类的一条虚线箭头来表示的。在依赖关系中通常没有多个依赖共存的情况,都是一对一的关系。
关联关系表示的是一个实例向另一个实例发送消息的能力。这通常由指针或引用实例变量实现。
组合关系是一种特殊的关联关系类型,代表类之间一种非常强烈的从属关系。例如上图,ClassA是整体类,ClassB是A的一部分,使用实心菱形来表示。组合关系描述了类之间的包含关系。
//A类是B,C类的组合
public class A{
private B b;
private C c;
public A(){
this.b=new B();
this.c=new C();
}
//删除了A,则B,C,也会删除,因为是有A构造函数创建的B,C
在聚合关系中,整体类要比部分类起到更重要的作用,但这两个类不是相互依存的,我们使用空心菱形表示一个简单的聚合关系。聚合关系描述类之间存在部分和整体的关系。
//A是B和C的聚合
public class A{
private B b;
private C c;
public A(B b,C c){
this.b=b;
this.c=c;
}
}
//如果对A类的删除并不需要删除B,C。
比如:一个人有手,脚,心脏等,这就是组合。
一个人有房子,车子,计算机,这就是聚合关系。
- 聚合关系是一种弱关联,对象能够彼此进行独立创建。
- 组合关系是一种强关联,部分对象在其他对象中创建。
- 在聚合关系中对象可以彼此独立存在
- 泛化
泛化关系描述了对象世界中的继承关系,也就是父类与子类的关系。用空心箭头表示,箭头指向的一端表示父元素,另一端则表示子元素。 - 扩展
UML图
主要有两种基本分类:静态结构图与动态行为图;
四种静态结构图如下:
-类图
-对象图
-组件图
-部署图
UML具有以下5种类型的动态行为图:
-用例图
-顺序图
-协作图
-状态图
-活动图