UML--类图

设计模式—UML类图

欢迎关注笔者的微信公众号


UML

UML是一种开放的方法,用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的制品的开放方法。UML展现了一系列最佳工程实践,这些最佳实践在对大规模,复杂系统进行建模方面,特别是在软件架构层次已经被验证有效。

UML 2.2中一共定义了14种图示。为方便了解,可分类成右侧的结构。

结构性图形(Structure diagrams)强调的是系统式的建模:

  • 静态图(static diagram)
    • 类图
    • 对象图
    • 包图
  • 实现图(implementation diagram)
    • 组件图
    • 部署图
  • 剖面图
  • 复合结构图

行为式图形(Behavior diagrams)强调系统模型中触发的事件:

  • 活动图
  • 状态图
  • 用例图

交互性图形(Interaction diagrams),属于行为图形的子集合,强调系统模型中的资料流程:

  • 通信图
  • 交互概述图(UML 2.0)
  • 时序图(UML 2.0)
  • 时间图(UML 2.0)

UML--类图_第1张图片

类图

类图是什么?

用于描述系统中的类(对象)本身的组成和类(对象)之间的各种静态关系。

类图的表示
+    公共 public
-     私有 private
#    保护(即对子类可见)protected
~    包(对包内其他成员可见)
/     推导(即由其他属性推导得出,不需要直接给定其值)

例如:有一个Person

@Data	// lombok框架提供的注解,可以不显示定义getter, setter
public class Person {
    private Integer age;
    private String name;
    protected Date birthday;
}

其类图为:
UML--类图_第2张图片

类之间的关系

类之间的关系:依赖泛化(继承)实现关联聚合组合

依赖

依赖关系(Dependency)可以简单的理解为一个类A使用到了另一个类B," … uses a …",被依赖的对象只是作为一种工具在使用,而并不持有对它的引用。而这种使用关系是具有偶然性、临时性的、非常弱的,但是B类的变化会影响到A;表现在代码层面,为类B作为参数被类A在某个method(方法)中使用。用带燕尾箭头的虚线表示。表示一个类依赖于另外一个类的定义;依赖关系仅仅描述了类与类之间的一种使用与被使用的关系。

图例:

有这样一个类:

public class PersonService {
    private PersonDao personDao;

    public void save(Person person) {
    }
    public IDCard getIDCard(Integer personid) {
        return new IDCard();
    }

    public void modify() {
        Department department = new Department();
    }
}

对应的类图: UML--类图_第3张图片

小结

  • 类中用到了对方
  • 如果是类的成员属性
  • 如果是方法的返回类型
  • 是方法接收的参数类型
  • 方法中使用到
泛化

泛化(Generalization),即继承的反方向,指的是一个类(称为父类、父接口)具有另外的一个(或一些)类(称为子类、子接口)的共有功能。子类可视为其父类的特例,并可以增加新功能。用带空心三角形箭头的实线表示。

图例:
在这里插入图片描述

抽象类-Animal:

public abstract class Animal {
    /**
     * 颜色
     * @return
     */
    String color() {
        return "RED";
    }

    /**
     * 有几只脚
     * @return
     */
    Integer feetNum() {
        return 2;
    }
}

子类-Pig:

public class Pig extends Animal {

    @Override
    String color() {
        return "BLUE";
    }

    @Override
    Integer feetNum() {
        return 4;
    }
}

对应的类图:
UML--类图_第4张图片
小结:

  • 泛化关系实际上就是继承关系
  • 如果 A 类继承了 B 类,我们就说 A 和 B 存在泛化关系
实现

实现(Realization)指的是一个class类实现interface接口(可以是多个)的功能;在Java中此类关系通过关键字implements明确标识。用带空心三角形箭头的虚线表示。

图例:
在这里插入图片描述

接口-UserService:

public interface UserService {

    List<User> findAll();

    void deleteAll();
}

实现类-UserServiceImpl:

public class UserServiceImpl implements UserService {

    public List<User> findAll() {
        return null;
    }

    public void deleteAll() {

    }
}

对应的类图:
UML--类图_第5张图片

小结:

实现关系实际上就是 A 类实现 B 接口,他是依赖关系的特例

关联

一个关联(Association)代表一个家族的联系。关联可以命名,可以饰以角色名称,有权指针,多重性,可视性,以及其他属性(如相互关联和有方向的(带燕尾箭头的实线表示)关联)。在语义上是两个类之间、或类与接口之间一种强依赖关系,是一种长期的稳定的关系," … has a …" 。关联关系使一个类知道另外一个类的属性和方法;通常含有“知道”、“了解”的含义。某个对象会长期的持有另一个对象的引用,关联的两个对象彼此间没有任何强制性的约束,只要二者同意,可以随时解除关系或是进行关联,它们在生命期问题上没有任何约定。被关联的对象还可以再被别的对象关联,所以关联是可以共享的。 在代码层面上,被关联类以类属性的形式出现在关联类中,也可能是关联类引用了一个类型为被关联类的全局变量。当前定义有五种不同类型的关联。双向(Bi-directional)和单向(uni-directional)的关联是最常见的。

图例:
在这里插入图片描述
以下例子说明每个人都有一辆汽车

public class Car {
}
@Data
public class Person {
    private Car car;
}

对应的类图:
UML--类图_第6张图片

聚合

聚合(Aggregate)是表示整体与部分的一类特殊的关联关系,是“弱”的包含(" … owns a …" )关系,成分类可以不依靠聚合类而单独存在,可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享(sharable)。例如,池塘与(池塘中的)鸭子。再例如教授与课程就是一种聚合关系。又例如图书馆包含(owns a) 学生和书籍。即使没有图书馆,学生亦可以存在,学生和图书馆之间的关系是聚集。聚集可能不涉及两个以上的类。图形以空心的菱形箭尾与实线来表示。

图例:
在这里插入图片描述
以下例子说明学生都拥有课本,但是学生与课本是可以单独存在的,其存在与否并不依赖对方的状态

课本-Book:

public class Book {
}

学生-Student:

@Data
public class Student {
    private Book book;
}

对应的类图:
UML--类图_第7张图片

组合

组成(Composition)关系,是一类“强”的整体与部分的包含关系(" … is a part of …")。成分类必须依靠合成类而存在。整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束。合成类别完全拥有成分类别,负责创建、销毁成分类别。例如汽车与化油器,又例如公司与公司部门就是一种组成关系。图形以实心的菱形箭尾与实线表示。

图例:
在这里插入图片描述

以下例子说明每个人都有大脑,心脏,腿等器官,若一个人存在则大脑,心脏,腿等器官就存在,若一个人死亡则大脑,心脏,腿等器官也消亡

public class Heart {
}
public class Brain {
}
public class Foot {
}
@Data
public class Man {
    private Brain brain;
    private Heart heart;
    private Foot foot;
}

对应的类图:
UML--类图_第8张图片

总结

UML--类图_第9张图片

你可能感兴趣的:(后台开发,java,设计模式)