问鼎娱乐下载入口 UML类图:类、继承和实现、关联、聚合、组合、依赖

---------------UML 类图(第 1 部分):类、继承和实现------------------------ - ----

面向对象设计

对于程序员来说,在工作的初期,通常是别人设计东西,你做。随着个体的成长,这个过程会逐渐变成自己设计并实现一些功能。如果你想自己设计,无论是给自己还是别人,你都必须输出一些文档,清晰地组织你的想法。

对于文档,有人会用文字,但无论有多少文字,在大多数人眼中,都不会有一张直白的图画。本文将讨论如何使用 UML 图进行面向对象的设计。

面向对象设计主要使用UML类图。类图用于描述系统所包含的类以及它们之间的关系,帮助人们简化对系统的理解。它是系统分析和设计阶段的重要产物,也是系统编码和测试的重要模型基础。

UML 类图分为两部分。第一部分讲述类、继承和实现之间的三种关系。我们接下来开始吧。

类的UML绘图方法

Java是面向对象的语言,最基本的就是类。类封装了数据和行为,是面向对象的重要组成部分。它是具有相同属性、操作和关系的对象集合的总称。在系统中问鼎app官方下载,每个类都有一定的职责。职责是指班级必须完成哪些职能、必须承担哪些义务。一个类可以有多种职责,但一个设计良好的类通常只承担一种职责。

如果我现在定义一个这样的类:

public class Person 
{
    private String name = "Jack";
    public String getName() 
    {
        return name;
    }
    public void setName(String name) 
    {
        this.name = name;
    }
    
    protected void playBasketball() 
    {
        pass();
    }
    
    private void pass() 
    {
    }
}

那么这个类对应的UML就是:

聚合和继承_聚合优先于继承_组合优先于继承

可以看到该图分为三层:顶层是类名,中间层是属性,底层是方法。

属性表示为:[可见性][属性名称]:[类型]={默认值问鼎娱乐电子游戏,可选}

方法表达为:[可见性][方法名称]([参数列表]):[类型]

可见性是一样的,“-”表示私有,“+”表示公开,“#”表示受保护。

继承关系

继承也称为泛化问鼎娱乐下载链接入口,用于描述父类和子类之间的关系。父类也称为基类或超类,子类也称为派生类。在 UML 中,泛化关系由带有空心三角形的实线表示。

假设现在我定义一个学生和一个教师:

public class Student extends Person 
{
    private String studentNo;
    
    public void study() 
    {
    }
}

public class Teacher extends Person 
{
    private String teacherNo;
    
    public void teach() 
    {
    }
}

那么,用UML来表达这种关系应该是:

聚合优先于继承_组合优先于继承_聚合和继承

抽象继承关系

上面的继承是普通继承。在Java中,除了普通的继承之外,众所周知,还有一种抽象的继承关系。因此,我们再讲一下抽象继承关系,作为上面继承的补充。

比如我想实现一个链表(Link)。我想要一个子类来实现插入和删除操作。链表本身只实现了对链表中元素数量进行计数(count)的动作,然后还有子类。单向链表(OneWayLink)来实现父类未实现的动作,Java代码为:

public abstract class Link
{
    public abstract void insert();
    public abstract void remove();
    
    public int count()
    {
        return 0;
    }
}

public class OneWayLink extends Link
{
    public void insert()
    {
        
    }
    public void remove()
    {
        
    }
}

其UML绘图方法为:

聚合和继承_组合优先于继承_聚合优先于继承

在UML中,抽象类,包括类名和抽象方法名,都用斜体表示。因为这也是一种继承关系,所以子类和父类是通过带空心三角形的实线连接起来的。

认识关系

很多面向对象语言中都引入了接口的概念,例如Java、C#等。接口中通常没有属性,所有操作都是抽象的。只有操作的声明,没有操作的实现。接口在 UML 中的表示方式与类类似。假设我有一只动物:

public interface Animal 
{
    public void move();
    public void eat();
}

那么它的UML应该表示为:

组合优先于继承_聚合优先于继承_聚合和继承

这很简单。请注意,该方法应表明这是一个接口。接口一般没有属性,所以这里没有中间层。如果有属性,请注意它们都是常量。

接下来,有一只狗和一只猫实现了 Animal:

public class Dog implements Animal 
{
    public void move() 
    {
        
    }
    public void eat() 
    {
        
    }
}

public class Cat implements Animal 
{
    public void move() 
    {
        
    }
    public void eat() 
    {
        
    }
}

这时应该用带有空心三角形的虚线来表示,UML应该是这样的:

聚合和继承_组合优先于继承_聚合优先于继承

Dog和Cat这两个抽象方法的实现会有所不同。当然,Dog和Cat也可以给Dog和Cat添加自己的变量和方法。

--------------------------UML类图(第2部分):关联、聚合、组合、依赖------ - ------------------

UML 类图(上图):类、继承和实现。讲了UML类图中类、继承、实现这三种关系以及如何在UML类图中绘制它们。下面的内容将继续上面的内容。对象之间还有其他几种关系,主要是关联、聚合、组合、依赖。下面开始文章的内容。

关联关系

关联关系是类之间最常见的关系。它是一种结构化的关系,表示一类对象与另一类对象之间的联系,如汽车和轮胎、师父和徒弟、班级和学生等。在UML类图中,用实线来连接对应的类到相关对象。在Java中,一个类的对象通常用作另一类的成员变量。关联关系分为单向关联、双向关联和自关联。让我们一一看看。

1. 单向关联关系

单向关联是指关联只有一个方向。例如,客户有一个地址。其Java实现是:

public class Address
{
}

public class Customer
{
    private Address address;
}

UML绘制为:

2. 双向关联关系

默认情况下,关联是双向的。例如,客户购买产品。相反,销售的产品总是与特定的客户相关联。这是一个双向关联。 Java类的写法为:

public class Product
{
    private Customer customer;
}

public class Customer
{
    private Product[] product;
}

对应的UML类图应该是:

3、自相关关系

自关联是指对象中的属性就是对象本身。这在链表中很常见。单向链表节点将维护其前驱节点,双向链表节点将维护其前驱节点及其后继节点。节点。以单向链表为例,其Java编写方法为:

public class Node
{
    private Node nextNode;
}

对应的UML类图应该是:

组合优先于继承_聚合优先于继承_聚合和继承

聚合关系

聚合关系表示整体与部分之间的关​​系。在聚合关系中,成员对象是整体的一部分,但成员对象可以独立于整个对象而存在。在UML中,聚合关系用带有空心菱形的直线表示,例如Car和Engine、Wheel和Light。 Java 表示为:

public class Engine
{
}

public class Wheel
{
}

public class Light
{
}

public class Car
{
    private Engine engine;
    private Light light;
    private Wheel wheel;
    
    public Car(Engine engine, Light light, Wheel wheel)
    {
        super();
        this.engine = engine;
        this.light = light;
        this.wheel = wheel;
    }
    
    public void drive()
    {
        
    }
}

对应的UML类图为:

组合优先于继承_聚合和继承_聚合优先于继承

代码实现聚合关系,成员对象通常通过构造函数和setter方法注入到整体对象中。

组合关系

组合关系也代表了整体与部分的关系,但在组合关系中,整体对象可以控制成员对象的生命周期。一旦整个对象不存在,成员对象也不存在。整体对象和成员对象之间存在着生死存亡的关系。在 UML 中,组合关系由带有实心菱形的直线表示。

例如人的头部(Head)、嘴巴(Mouth)、鼻子(Nose)。嘴和鼻子是头部的组成部分之一。头没了,嘴也没了,所以头、口、鼻是一个结合的关系。 Java表示为:

public class Mouth
{
}

public class Nose
{
}

public class Head
{
    private Mouth mouth;
    private Nose nose;
    
    public Head()
    {
        mouth = new Mouth();
        nose = new Nose();
    }
    
    public void shake()
    {
        
    }
}

其UML表示方法为:

当代码实现组合关系时,通常会在整体类的构造函数中直接实例化成员类。这是因为整体和部分的组合关系是共生的。如果通过外部手段注入,即使整体不存在,部分仍然存在。这相当于成为了聚合关系。

依赖关系

依赖关系是一种使用关系。对特定事物的更改可能会影响使用该事物的其他事物。当需要表明一个事物使用另一个事物时,就会使用依赖关系。大多数情况下,依赖关系体现在某些事物上。一个类的方法将另一个类的对象作为参数。在UML中,依赖关系用带箭头的虚线表示,从依赖方指向被依赖方。

例如,如果驾驶员驾驶汽车,则Driver类的drive()方法将Car对象作为参数传递,这样就可以在drive()方法中调用汽车的move()方法,并且驾驶员的drive( ) ) 方法依赖于汽车的 move() 方法,因此也可以说 Driver 依赖于 Car。 Java代码是:

public interface Car
{
    public void move();
}

public class Driver
{
    public void drive(Car car)
    {
        car.move();
    }
}

其UML绘图方法为:

依赖关系通常通过三种方式实现:

使用一个类的对象作为另一个类中方法的参数 在一个类的方法中使用另一个类的对象作为其对象的局部变量 在一个类的方法中调用另一个类的静态方法

关联关系、聚合关系、组合关系的区别

从上面可以看出,关联关系、聚合关系、组合关系都比较相似。在本文的最后,我们将总结一下三者之间的区别。

关联和聚合的区别主要在于语义上:关联的两个对象一般是相等的,而聚合一般是不相等的。

聚合和组合的区别在于语义和实现上:两个组合对象的生命周期密切相关。组合对象是在组合对象创建的同时或者在组合对象创建之后、组合对象被销毁之前创建的。破坏,一般来说,组合体不能脱离组合体而独立存在,只能属于一个组合体;聚合则不同,聚合对象可以属于多个聚合对象。

再举一个例子:

但在实际应用中,我个人感觉这三种关系并没有那么明确区分。有的架构师甚至会说“组合和聚合没有区别”。所以,有时候没必要把细节处理得那么精细,合理利用物体。根据它们之间的关系给出设计方案即可。

这篇文章转到:

关键词:

客户评论

我要评论