UML类图

UML概述

UML(Unified Modeling Language,统一建模语言)是当前面向对象软件系统建模的标准语言,适用于各种软件开发方法、软件生命周期的各个阶段、各种应用领域以及各种开发工具,UML是一套总结了以往建模技术的经验并吸收了当今最优秀成果的标准建模方法。
其结构主要包括以下4部分:
(1)视图(View):UML视图用于从不同的角度来表示待建模系统。视图是由许多图形组成的一个抽象集合,在建立一个系统模型时只有通过定义多个视图,每个视图显示该系统的一个特定方面,才能构造出该系统的完整蓝图,视图也将建模语言链接到开发所选择的方法和过程。UML视图包括用户视图、结构视图、行为视图、实现视图和环境视图。
(2)图(Diagram):UML图是描述UML视图内容的图形。UML2.0提供了13种图,分别是用例图(Use Case Diagram)、类图(Class Diagram)、对象图(Object Diagram)、包图(Package Diagram)、组合结构图(Composite Diagram)、状态图(State Diagram)、活动图(Activity Diagram)、顺序图(Sequence Diagram)、通信图(Communication Diagram)、定时图(Timing Diagram)、交互概览图(Interaction Overview Diagram)、组件图(Component Diagram)和部署图(Deployment Diagram),通过它们之间的相互组合可提供待建模系统的所有视图。
(3)模型元素(Model Element):模型元素是指UML图种所使用的一些概念,它们对应于普通的面向对象概念,如类、对象、消息以及这些概念之间的关系,例如关联关系、依赖关系、泛化关系等。同一个模型元素可以在多个不同的UML图中使用,但是无论在哪个图中,同一个模型元素都必须保持相同的意义并具有相同符号。
(4)通用机制(General Mechanism):UML提供的通用机制为模型元素提供额外的注释、语义和其他信息,这些通用机制也提供了扩展机制,允许用户对UML进行扩展,如定义新的建模元素、扩展原有元素的语义、添加新的特殊信息来扩展模型元素的规则说明等,以便适用于一个特定的方法或过程、组织或用户。

类与类的UML表示

在UML2.0的13种图形中,类图是使用最广泛的图形之一,它用于描述系统中所包含的类以及它们之间的相互关系,每一个设计模式的结构都可以使用类图来表示。

1、类

一个类可以有多种职责,设计得好得类通常有且仅有一种职责。在定义类得时候将类得职责分解成为类得属性和操作(即方法)。类得属性即类得数据职责,类得操作即类得行为职责。设计类是面向对象设计中最重要得组成部分,也是最复杂和最耗时得部分。
类图(Class Diagram)使用出现在系统中得不同类来描述系统得静态结构,它用来描述不同得类以及它们之间得关系。

2、类的UML图示

在UML类图中,类一般由3部分组成。
(1)第一部分是类名:每一个类都必须有个名字,类名是一个字符串。通常采用帕斯卡命名法(Pascal Case),每个单词首字母大写。
(2)第二部分是类的属性(Attributes):属性即类的性质,即类的成员变量。一个类可以有任意多个属性,也可以没有属性。
UML规定属性的表示方式如下:

[可见性] 名称:类型 [ = 默认值 ]

①“可见性”表示该属性对于类外的元素而言是否可见,包括公有(public)、私有(private)和受保护(protected)3种,在UML类图中分别用符号“+”“-”和“#”表示。Java中还有包内可见,用符号“*“表示。

②”名称“表示属性名,用一个字符串表示。按Java的命名规范,采用驼峰命名法(Camal Case),第一个单词全小写,之后每个单词首字母大写。

③类型表示属性的数据类型
④默认值是一个可选项,即属性初始值

(3)第三部分是类的操作(Operations):操作是类的任意一个实例对象都可以使用的行为,是类的成员方法。
UML规定操作的表示方式如下:

[可见性] 名称([参数列表]) [ :返回类型 ]

①可见性的定义同属性可见性
②名称即方法名或操作名,采用驼峰命名法
③参数列表表示方法的参数,其语法与属性的定义相似,参数个数是任意的,多个参数之间用逗号“,”隔开。
④返回类型是一个可选项,表示方法的返回值类型,依赖于具体的编程语言,可以是基本数据类型,也可以是用户自定义类型,还可以是空类型(void),如果是构造方法,则无返回类型。

类之间的关系

1、关联关系

Ⅰ双向关联

默认情况下关联是双向的。例如顾客(Customer)购买商品(Product)并拥有商品,反之卖出的商品总与某个顾客与之关联。因此,Customer类和Product类之间具有双向关联关系。

双向关联实例
对应Java代码片段如下:

public class Customer {
	private Product[] products;
}


public class Product {
	private Customer customer;
}

Ⅱ 单向关联

类的关联关系也可以是单向的,单向关联用带箭头的实现表示。例如顾客(Customer)拥有地址(Address),则Customer类与Address类具有单向关联关系。
单向关联关系实例
对应的Java代码如下:


public class Customer {
	private Address address;
}


public class Address {
}

Ⅲ 自关联

在系统中可能存在一些类得属性对象类型为该类本身,这种特殊的关联关系叫自关联。例如一个节点类(Node)的成员又是节点Node类型的对象。
自关联实例
对应的Java代码如下:

public class Node {
	private Node subNode;
}

Ⅳ 多重性关联

多重性关联又称为重数性(Multiplicity)关联关系,表示两个关联对象在数量上的对应关系。在UML中,对象之间的多重性可以直接在关联直线上用一个数字或一个数字范围表示。
多重性表示方式表格如下:

表示方式多重性说明
1. . 1表示另一个类的一个对象只与该类的一个对象有关系
0. . *表示另一个类的一个对象与该类的零个或多个对象有关系
1. . *表示另一个类的一个对象与该类的一个或多个对象有关系
0. . 1表示另一个类的一个对象没有或只与该类的一个对象有关系
m. . n表示另一个类的一个对象与该类最少m、最多n个对象有关系(m≤n)

例如一个界面(Form)可以拥有零个或多个按钮(Button),但是一个按钮只能属于一个界面,因此一个Form类的对象可以与零个或多个Button类的对象相关联,但一个Button类的对象只能与一个Form类的对象关联。
多重性关联实例
对应Java代码如下:

public class Form {
	private Button[] buttons;//定义一个集合对象
}

public class Button {
}

Ⅴ 聚合关系

聚合(Aggregation)关系表示整体与部分的关系。在聚合关系中,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。在UML中,聚合关系用带空心菱形的直线表示。例如汽车发动机(Engine)是汽车(Car)的组成部分,但是汽车发动机可以独立存在,因此汽车和发动机是聚合关系。
聚合关系实例
对应Java代码如下:

public class Car {
	private Engine engine;
	//构造注入
	public Car(Engine engine) {
		this.engine = engine;
	}
	//设值注入
	public void setEngine(Engine engine) {
		this.engine = engine;
	}
}

public class Engine {
}

Ⅵ 组合关系

组合(Composition)关系也表示类之间的整体和部分的关系,但在组合关系中整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也将不存在,成员对象与整体对象之间具有同生共死的关系。在UML中,组合关系用带实心菱形的直线表示。例如人的头(Head)与嘴巴(Mouth),嘴巴是头的组成部分之一。
组合关系实例
在代码实现组合关系时,通常在整体类的构造方法中直接实例化成员类,对应Java代码如下:

public class Head {
	private Mouth mouth;
	public Head() {
		mouth = new Mouth();//实例化成员类
	}
}

public class Mouth {
}

2、依赖关系

依赖(Dependency)关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。例如驾驶员开车,在Driver类的drive()方法中将Car类型的对象car作为一个参数传递,以便在drive()方法中能够调用car的move()方法,驾驶员的drive()方法依赖车的move()方法,因此类Driver依赖类Car。
依赖关系实例
在系统实现阶段,依赖关系通常通过3种方式实现:
第一种如图所示,将一个类的对象作为另一个类中方法的参数;
第二种方式是在一个类的方法中将另一个类的对象作为其局部变量;
第三种方式是在一个类的方法中调用另一个类的静态方法。
上图对应Java代码如下:

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

public class Car {
	public void move() {
	
	}
}

3、泛化关系

泛化(Generalization)关系也就是继承关系,用于描述父类与子类之间的关系。在UML中,泛化关系用带空心三角形的直线来表示。在代码实现时,使用面向对象的继承机制来实现泛化关系,在Java中使用extends关键字来实现。例如Student类和Teacher类都是Person类的子类,Person类包含了姓名和年龄属性,和行走与说话方法,Student类和Teacher类在此基础上也新增了各自独有的属性和方法。
泛化关系实例对应Java代码如下:

public class Person {
	protected String name;
	protected int age;
	public void move() {
	
	}
	
	public void say() {
	
	}
}
//子类
public class Student extends Person {
	private String studentNo;
	public void study() {
	
	}
}
//子类
public class Teacher extends Person {
	private String teacherNo;
	public void teach() {
	
	}
}

4、接口与实现关系

在UML中用与类的表示法类似的方式表示接口。接口之间也可以有与类之间关系类似的继承关系和依赖关系,但是接口和类之间还存在一种实现(Realization)关系,在这种关系中类实现了接口。
接口的UML图示如下:
接口的UML图示
在UML中,类与接口之间的实现关系用带空心三角形的虚线来表示。例如定义个交通工具接口Vehicle,包含一个抽象操作move(),在类Ship和类Car中都实现了move()操作,不过具体实现细节不同。
实现关系实例Java代码如下:

public interface Vehicle {
	public void move();
}

public class Ship implements Vehicle {
	public void move() {
	
	}
	
}

public class Car1 implements Vehicle {
	public void move() {
	
	}

}
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值