UML基础系列:类图
类图描述系统中类的静态结构,它不仅定义系统中的类,描述类之间的联系,如关联、依赖、聚合等,还包括类的内部结构(类的属性和操作)。类图描述的是静态关系,在系统的整个生命周期中都是有效的。对象图是类图的实例,它们的不同之处在于对象图显示类图的多个对象实例,而不是实际的类。由于对象存在生命周期,所以对象图只能在系统某一时间存在。
1. 类图概述
类图(Class Diagram)是描述类、接口、协作以及它们之间关系的图,用来显示系统中各个类的静态结构。类图是一种模型类型,一种静态模型类型。一个类图根据系统中的类以及各个类之间的关系描述系统的静态结构。
类图是面向对象系统建模中最常用的图,它是定义其他图的基础,在类图的基础上,可以使用状态图、协作图、组件图和配置图等进一步描述系统其他方面的特性。
类图包含7个元素:类(Class)、接口(Interface)、协作(Collaboration)、依赖关系(Dependency)、泛化关系(Generalization)、关联关系(Association)以及实现关系(Realization)。
2. 类(Class)
类是对一组具有相同属性、操作、关系和语义的对象的描述。类定义聊了一组有着状态和行为的对象。其中,属性和关联用来描述状态。属性通常用没有身份的数据值表示。关联则用有身份的对象之间的关系表示。行为由操作来描述,方法是操作的实现。
在UML中,类用矩形来表示,并且该矩形被划分为3个部分:名称部分(Name)、属性部分(Attribute)和操作部分(Operation)。其中顶端的部分存放类的名称,中间的部分存放类的属性、属性类型及其值,底部的部分存放类的操作、操作的参数和返回类型。
类的属性格式:
name : attribute type
UML规范允许在属性列表节中设置默认值的标识。
name : attribute type = default value
类的操作格式:
name (parameter list) : type of value returned
当一个操作有参数时,参数被放在操作的括号内,参数格式:
parameter name : parameter type
当文档化操作参数时,可以使用一个可选择的指示器,以显示参数到操作的输入参数或输出参数。in 表示输入参数,out 表示输出参数。按照UML规范, in 是参数的默认类型。
3. 类之间的关系
类之间的关系最常用的有4种,分别是表示类之间使用关系的依赖关系(Dependency)、表示类之间一般和特殊关系的泛化关系(Generalization)、表示对象之间结构关系的关联关系(Association)、表示类中规格说明和实现之间关系的实现关系(Realization)。
3.1 依赖关系(Dependency)
依赖关系用于表示类之间的使用关系,UML定义了4种基本依赖类型:使用依赖、抽象依赖、授权依赖和绑定依赖。
使用依赖是最常用的依赖,使用依赖关系图:
表示客户使用提供者提供的服务以实现它的行为。可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A。客户使用产品需要提供者,但一个客户需要的产品可以有多个提供者。
场景:Driver与Car,Driver驾驶之前需要Car能够开动。
依赖关系图:
C#实现:
public class Driver { pulic void Drive(Car car) { car.Move(); } } public class Car { pulic void Move() { // 省略代码 } }
3.2 泛化关系(Generalization)
泛化关系是一种存在于一般元素和特殊元素之间的分类元素。泛化关系主要表现为类与类之间的继承关系、类与接口之间的实现关系。
场景:形状类(Shape)为基类,圆形类(Circle)、矩形类(Rectangle)和三角形类(Triangle)均继承形状类。
类之间的泛化关系图:
C#实现:
Shape.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Text; public abstract class Shape { protected string _name; public Shape(string name) { this._name = name; } /// <summary> /// 面积 /// </summary> /// <returns></returns> public abstract double Area(); /// <summary> /// 显示 /// </summary> public abstract void Display(); }
Circle.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Text; /// <summary> /// 圆形 /// </summary> public class Circle : Shape { private double _radius; public Circle(string name, double radius) : base(name) { this._radius = radius; } public override double Area() { return Math.Round(Math.PI * _radius * _radius, 2); } public override void Display() { Console.WriteLine("{0} 半径:{1},面积:{2}", _name, _radius, this.Area()); } }
Rectangle.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Text; /// <summary> /// 矩形 /// </summary> public class Rectangle : Shape { private double _width; private double _height; public Rectangle(string name, double width, double height) : base(name) { this._width = width; this._height = height; } public override double Area() { return _width * _height; } public override void Display() { Console.WriteLine("{0} 长:{1},宽:{2},面积:{3}", _name, _width, _height, this.Area()); } }
Triangle.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Text; /// <summary> /// 三角形 /// </summary> public class Triangle : Shape { private double _a; private double _b; private double _c; /// <summary> /// 三角形构造函数 /// 参数:三角形名称和三条边长 /// </summary> /// <param name="name">三角形名称</param> /// <param name="a">第一条边长</param> /// <param name="b">第二条边长</param> /// <param name="c">第三条边长</param> public Triangle(string name, double a, double b, double c) : base(name) { _a = a; _b = b; _c = c; } public override double Area() { double p = (_a + _b + _c) / 2; return Math.Sqrt(p * (p - _a) * (p - _b) * (p - _c)); } public override void Display() { Console.WriteLine("{0} 三条边长:{1},{2},{3},面积:{3}", _name, _a, _b, _c, this.Area()); } }
3.3 关联关系(Association)
关联关系是一种结构关系,它指明一个事物的对象与另一个事物的对象之间的联系。关联关系比依赖关系更强,不存在依赖关系的偶然性,关系也不是临时性的,而一般是长期性的。
3.3.1 单向关联(DirectedAssociation)
场景:商品和订单,订单中包含商品信息,但商品中不包含订单信息。
类之间单向关联图:
C#实现:
Product.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Text; public class Product { public int ProductID { get; set; } public string ProductName { get; set; } public void Add() { } public void Remove() { } protected void Find() { } }
Order.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Text; public class Order { public int OrderID { get; set; } public List<Product> GetProductsByOrderID(int orderID) { List<Product> products = new List<Product>(); // 省略代码 return products; } }
3.3.2 双向关联(Association)
场景:用户与角色,一个用户可以属于多个角色,同时一个角色也可以拥有多个用户。
类之间的双向关联图:
C#实现:
User.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Text; public class User { public int UserID { get; set; } public string UserName { get; set; } public List<Role> GetRolesByUserID(int userID) { return new List<Role>(); } }
Role.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Text; public class Role { public int RoleID { get; set; } public string RoleName { get; set; } public List<User> GetUsersByRoleID(int roleID) { return new List<User>(); } }
3.3.3 聚合关系(Aggregation)
聚合表示的是一种has-a的关系,是一种整体-部分关系,同时整体与部分之间又可以相互分离。整体与部分拥有相互独立的生命周期,部分的生命周期并不由整体来管理决定。当整体这个对象已经不存在的时候,部分的对象还是可能继续存在的。整体可以包含多个部分,部分可以属于多个整体对象,也可以为多个整体对象共享。
场景:汽车与车轮,汽车有多个车轮。车轮使用周期结束,可以为汽车安装新的车轮。同时汽车使用周期结束,可再用的车轮也可以卸下安装到其他的汽车上。
聚合关系图:
C#实现:
Wheel wheel = new Wheel(); Car car = new Car(wheel);
或者
Car car = new Car(new Wheel());
Car与Wheel的生命周期相互独立。
3.3.4 组合关系(Composition)
组合关系是聚合关系的另一种形式,体现的是一种contains-a的关系,但是整体与部分拥有共同是生命周期,整体与部分不可分,一旦整体对象不存在,部分对象也将不存在。子类对象的生命周期依赖于父类的生命周期。
场景:公司(Company)与公司内部设置的部门(Department),一个Company对象至少有一个Department对象,当Company对象被销毁时,Department对象也将同时被销毁。
组合关系图:
C#实现:
public class Department () { // 省略代码 } pulic class Company () { Department d = new Department (); // 省略代码 }
Department对象在Company对象中创建,当Company对象的生命周期结束的时候,Department对象的生命周期同时也结束。
3.4 实现关系(Realization)
实现是规格说明和其实现之间的关系,实现关系通常在两种情况下被使用:在接口与实现该接口的类之间;在用例以及实现该用例的协作之间。
实现关系图:
转自:http://www.cnblogs.com/libingql/p/3505063.html
UML基础的更多相关文章
-
UML基础与Rose建模实训教程
目 录 第1章 初识UML. 1 1.1 初识UML用例图... 1 1.2 初识UML类图... 3 第2章 Rational Rose工具... 6 2.1 安装与配置Rational Ro ...
-
UML基础概念(转)
UML基础概念 UML概述 uml简介 uml(unified Modeling Language )为面向对象软件设计提供统一的.标准的.可视化的建模语言.适用于描述以用例为驱动,以体系结构为中心的 ...
-
UML基础—结构和组成
本文主要梳理了一下UML2中的各个图的逻辑划分,UML基础知识. 一.UML2的4个规范 二.UML2的13种模型图 分为3大类:行为视图.交互视图.结构视图 三.UML1和UML2各种视图对照 四. ...
-
UML uml基础知识
uml基础知识 一.了解: uml是Unified Modeling Language的缩写,意思是统一建模语言或标准建模语言. UML规范用来描述建模的概念有,类(对象的).对象.关联.职责.行为. ...
-
UML基础与应用总结
敲响一段键盘的乐响曲,一段路程留下一些足迹. UML.是Unified-Modeling-Language的缩写. 首先要明白知道它是一种可视化的建模语言. 什么是UML基 ...
-
【二】、UML基础知识——图图解乾坤
[二].UML基础知识 UML概述 UML是一个通用的可视化建模语言,不同于编程语言,它通过一些标准的图形符号和文字来对系统进行建模.用于对软件进行描述.可视化处理.构建软件系统的文档.是一套总结了以 ...
-
OOAD利器之UML基础
UML:Unified Modeling Language,即统一建模语言,简单地说就是一种有特殊用处的语言.本文是我初步学习UML的学习笔记,对于我们菜鸟码农来说,让我们做设计的可能性不大,但至少能 ...
-
UML基础系列:类图
类图描述系统中类的静态结构,它不仅定义系统中的类,描述类之间的联系,如关联.依赖.聚合等,还包括类的内部结构(类的属性和操作).类图描述的是静态关系,在系统的整个生命周期中都是有效的.对象图是类图的实 ...
-
UML基础系列:用例图
1. 概述 用例图(Use Case Diagram)描述“用户.需求.系统功能单元”之间的关系,是参与者所能观察和使用到的系统功能模型图. 用例图用于需求分析阶段 用例图包含6个基本元素:参与者(A ...
随机推荐
-
可视化日历_Java实现
//刚刚学Java,写的小程序 package cn.xiaocangtian.testDate; import java.text.DateFormat; import java.text.Pars ...
-
TCP及IP报头及协议
看到有道题目要问:tcp头多少字节?哪些字段?(必问) 这个... 看了这篇文章做参考:http://blog.163.com/tianshuai11@126/blog/static/61894543 ...
-
Response.End(); 用HttpContext.Current.ApplicationInstance.CompleteRequest 代替
Response.End(); 会报异常 HttpContext.Current.ApplicationInstance.CompleteRequest 这里有个讨论的帖子很有意思:http://q. ...
-
Poj 3517 And Then There Was One Joseph核心问题
基本上纯Joseph核心问题,只是第一步多一件.m. 然后你就可以用获得的递推公式: Win(n) 代表n当个人的中奖号码, 然后,Win(n)必须相等Win(n-1).当一个人将在下一次删除队列. ...
-
使用python写一个简单的C段扫
纠结C段查询N久..刚刚拿骚棒FD去抓御剑的包,发现emmm...申请了必应的Key 然后去拿必应API查.这里疼[心]原本也想去弄的.但是人懒. 然后就没有然后了. 代码: 生成IP段的脚本图1 # ...
-
ConstraintLayout布局介绍.md
一.介绍 ConstraintLayout是一个ViewGroup允许您以灵活的方式定位和调整窗口小部件的窗口.从api9开始支持.继承自viewGroup; 二.具体使用 这个控件的具体分类主要有如 ...
-
03SpringBoot用JdbcTemplates访问Mysql
03SpringBoot用JdbcTemplates访问Mysql 文章指导 学习笔记 学习代码 初始化mysql -- create table `account` DROP TABLE `acco ...
-
Non-negative Integers without Consecutive Ones
n位二进制,求不包含连续1的二进制(n位)数字个数. http://www.geeksforgeeks.org/count-number-binary-strings-without-consecut ...
-
解决Android启动显示空白界面的问题
Android程序启动时,第一个看的界面并不是我们的指定的第一个Activity界面,而是显示了一个空白的界面,带标题栏的,但是界面什么内容都没有,这个界面只显示不到1秒左右的时间就会切换到我们的第一 ...
-
JS 检测客户端断网情况
常用方法 1 navigator.onLine 2 window.addEventListener() 3 获取网络资源 4 ajax请求 1. navigator.onLine 只会在机器未连上路由 ...