问鼎娱乐下载入口 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绘图方法为:
依赖关系通常通过三种方式实现:
使用一个类的对象作为另一个类中方法的参数 在一个类的方法中使用另一个类的对象作为其对象的局部变量 在一个类的方法中调用另一个类的静态方法
关联关系、聚合关系、组合关系的区别
从上面可以看出,关联关系、聚合关系、组合关系都比较相似。在本文的最后,我们将总结一下三者之间的区别。
关联和聚合的区别主要在于语义上:关联的两个对象一般是相等的,而聚合一般是不相等的。
聚合和组合的区别在于语义和实现上:两个组合对象的生命周期密切相关。组合对象是在组合对象创建的同时或者在组合对象创建之后、组合对象被销毁之前创建的。破坏,一般来说,组合体不能脱离组合体而独立存在,只能属于一个组合体;聚合则不同,聚合对象可以属于多个聚合对象。
再举一个例子:
但在实际应用中,我个人感觉这三种关系并没有那么明确区分。有的架构师甚至会说“组合和聚合没有区别”。所以,有时候没必要把细节处理得那么精细,合理利用物体。根据它们之间的关系给出设计方案即可。
这篇文章转到:
我要评论