UML类图基础-依赖,关联,泛化,聚合,组合,实现

转载自:https://www.cnblogs.com/mingorun/p/11029640.html

UML基础

UML( Unified Modeling Language) 统一建模语言, 它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持,包括由需求分析到规格,到构造和配置。
UML类图分为三个部分,最上面部分是类的类名,中间部分是类属性的,最小面部分是类的方法,其中属性和方法分别使用"+”、“#”、“-” 分别表示public、protected、private。
UML图中经常用到的类与类之间的关系: 依赖,关联,泛化,聚合,组合,实现;(具体的关系可以通过类的实现来概括)
 
一 依赖:
 
如果A类的变化引起的B类的变化,则称B类依赖于A类
 
依赖关系(Dependency) 是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。
大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。
 
UML图中,依赖关系使用带箭头的虚线表示, 由依赖的一方指向被依赖的另一方。
 
    
 1 public class Driver
 2 {
 3    public void drive(Car car)
 4    {
 5        car.move();
 6    }
 7    ……
 8 }
 9 public class Car
10 {
11     public void move()
12     {
13         ......
14     }
15     ……
16 }

二 关联:

关联( Association)关系 是一种拥有的关系,可以是一对多的拥有,如:篮球队和篮球运动员的关联关系(每个球员都有自己所属的球队,每个球队都有自己的球员),
也可以是一对一的关联关系如 妻子与丈夫的关系; 另外关联关系还可以是单项的关联,如购物用户和用户收货地址。
 
关联关系与依赖关系的区别:关联关系属于类与类之间的联接,Java语言中关联关系一般使用成员变量来实现,即一个类在另一个类中是成员变量。而依赖关系中,被
依赖类并不出现在依赖类的成员变量中,而只是以传参的方式传入到依赖类中某些方法中,在Java语言中体现为局部变量,方法的形参等
 
在UML类图中,使用实线连接有关联的对象所对应的类,如果是单向关联关系则使用带箭头的实线,如果是双向关联关系就使用无箭头的实线

 1 // 双向关联  1 public class Team {
 2  2     private String name;
 3  3     private String address;
 4  4  
 5  5     private Player[] players;
 6  6 }
 7  7  
 8  8 public class Player {
 9  9     private String name;
10 10     private Team team;
11 11  
12 12 }
 1 // 单向关联 1 public class Customer  
 2  2 {  
 3  3     private Address address;  
 4  4     ……  
 5  5 }  
 6  6  
 7  7 public class Address  
 8  8 {  
 9  9    ……  
10 10  }
另外还有一种自关联的关系,表现为自身类被定义为自己的一个属性
        
代码实现:
1 public class Node {
2  
3     private Node node;
4  
5 }

 三 泛化(继承)

若A是B和C的父类,B、C具有公共类(父类)A,说明A是B,C的一般化(概括,也称泛化)

泛化关系 也就是指继承关系,也称为“is-a-kind-of”关系,泛化关系用于描述父类和子类之间的关系,父类由称为基类或超类,子类又称作派生类。

在UML中,泛化(继承)关系使用带空心三角形的实线来表示

 1 public class Person
 2 {
 3    protected String name;
 4    protected int age;
 5    public void move()
 6    {
 7        ……
 8    }
 9    public void say()
10   {
11         ……
12    }
13 }
14 public class Student extends Person
15 {
16     private String studentNo;
17     public void study()
18     {
19         ……
20     }
21 }

四、实现:

实现关系(Implementation):是用来规定接口和实现接口的类或者构建结构的关系,接口是操作的集合,而这些操作就用于规定类或者构建的一种服务。在UML中,类与接口之间的实现关系使用带空心三角形的虚线来表示。

 

 

 1 public interface Vehicle //包含了一组操作方法规格
 2 {
 3    public void move();
 4 }
 5 public class Ship implements Vehicle //实现操作集合
 6 {
 7     public void move()
 8     {
 9       ……
10     }
11 }
12 public class Car implements Vehicle //实现操作集合
13 {
14      public void move()
15      {
16        ……
17      }
18 }

 

 五 聚合:

聚合属于关联关系的一种(是一种has-a的关系):聚合是整体与部分之间的关系,与关联关系不同的是,关联关系涉及的两个类是处于相同层级的,而聚合关系中一个是整体另一个是部分。

从代码的层面来分析的话,聚合和关联关系是一致的,从语义层面来看的话,聚合关系中的两个类是存在一个(整体)包含另一个(部分)的关系的,这种一个包含另一个(也可以不包含)的关联关系就是聚合关系。

 

聚合关系中整体对部分的这种可包含可不包含的关联体现在,整体生命周期结束了,部分依然可以继续存在,譬如汽车坏掉了不工作了,把引擎取出来放到另一辆车上仍可以继续工作。

聚合关系使用空心的菱形+箭头和实现来表示,菱形指向整体,箭头指向部分。

 1 public class Car
 2 {
 3     private Engine engine;//一对一关联关系
 4     public Car(Engine engine)
 5     {
 6         this.engine = engine;//创建Car对象时,可以传入一个engine对象
 7     }
 8 
 9     public void setEngine(Engine engine)//或者在后期传入一个engine对象使用
10     {
11         this.engine = engine;
12     }
13     ……
14 }
15 public class Engine
16 {
17     ……
18 }

六 组合:

组合也属于关联关系的一种:组合关系体现的是一种contains-a的关系,同样的组合关系中双方也是一个是整体、一个是部分,但是组合关系中整体和部分是不可分离的,意味着如果整体的生命周期结束,则部分的生命周期也会结束。光是从代码层面也是不能区分这种关联关系是否是组合关系,需要从语义层面分析。

UML图中,组合关系使用实心的菱形+箭头以及实线来表示,实心菱形指向整体,箭头指向部分。

 1 public class Head
 2 {
 3     private Mouth mouth;//一对一关联关系
 4     public Head()
 5     {
 6     mouth = new Mouth();//在创建一个Head对象同时也去创建一个Mouth对象,同生同死
 7     }
 8     ……
 9 }
10 
11 public class Mouth
12 {
13     ……
14 }

 依赖--》关联--》聚合--》组合 集中关系中类 与类之间的耦合关系逐步增强(即一个类发生变化另一个类收到的影响程度逐步增强)

posted @ 2021-01-18 17:35  拥抱天空  阅读(836)  评论(0编辑  收藏  举报