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基础的更多相关文章

  1. UML基础与Rose建模实训教程

    目  录 第1章  初识UML. 1 1.1 初识UML用例图... 1 1.2 初识UML类图... 3 第2章  Rational Rose工具... 6 2.1 安装与配置Rational Ro ...

  2. UML基础概念(转)

    UML基础概念 UML概述 uml简介 uml(unified Modeling Language )为面向对象软件设计提供统一的.标准的.可视化的建模语言.适用于描述以用例为驱动,以体系结构为中心的 ...

  3. UML基础—结构和组成

    本文主要梳理了一下UML2中的各个图的逻辑划分,UML基础知识. 一.UML2的4个规范 二.UML2的13种模型图 分为3大类:行为视图.交互视图.结构视图 三.UML1和UML2各种视图对照 四. ...

  4. UML uml基础知识

    uml基础知识 一.了解: uml是Unified Modeling Language的缩写,意思是统一建模语言或标准建模语言. UML规范用来描述建模的概念有,类(对象的).对象.关联.职责.行为. ...

  5. UML基础与应用总结

          敲响一段键盘的乐响曲,一段路程留下一些足迹.       UML.是Unified-Modeling-Language的缩写. 首先要明白知道它是一种可视化的建模语言.   什么是UML基 ...

  6. 【二】、UML基础知识——图图解乾坤

    [二].UML基础知识 UML概述 UML是一个通用的可视化建模语言,不同于编程语言,它通过一些标准的图形符号和文字来对系统进行建模.用于对软件进行描述.可视化处理.构建软件系统的文档.是一套总结了以 ...

  7. OOAD利器之UML基础

    UML:Unified Modeling Language,即统一建模语言,简单地说就是一种有特殊用处的语言.本文是我初步学习UML的学习笔记,对于我们菜鸟码农来说,让我们做设计的可能性不大,但至少能 ...

  8. UML基础系列:类图

    类图描述系统中类的静态结构,它不仅定义系统中的类,描述类之间的联系,如关联.依赖.聚合等,还包括类的内部结构(类的属性和操作).类图描述的是静态关系,在系统的整个生命周期中都是有效的.对象图是类图的实 ...

  9. UML基础系列:用例图

    1. 概述 用例图(Use Case Diagram)描述“用户.需求.系统功能单元”之间的关系,是参与者所能观察和使用到的系统功能模型图. 用例图用于需求分析阶段 用例图包含6个基本元素:参与者(A ...

随机推荐

  1. Android <Android应用开发实战> 资源类型<一>

    1.字符串资源>>1.普通字符串>>2.字符串数组 <resources> <string-array name="planets_array&qu ...

  2. 从零开始学Linux系统(三)安装CentOS-7及软件包管理操作

    推荐博文: VirtualBox安装CentOS7步骤详解: https://my.oschina.net/AaronDMC/blog/840753 如何安装CentOS7字符界面 :http://b ...

  3. Python3简单入门

    在Mac和Linux上运行Python时,请打开终端,然后运行python3 Mac OSX 正确地同时安装Python 2.7 和Python3:  http://www.jianshu.com/p ...

  4. HDU 2852 主席树

    KiKi's K-Number Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  5. Rectangle 暴力枚举大法

    frog has a piece of paper divided into n rows and m columns. Today, she would like to draw a rectang ...

  6. HDU3265 线段树(扫描线)

    Posters Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  7. zookeeper源码分析之leader选举

    zookeeper提供顺序一致性.原子性.统一视图.可靠性保证服务zookeeper使用的是zab(atomic broadcast protocol)协议而非paxos协议zookeeper能处理并 ...

  8. ps命令查看进程指定项目信息、用户名过长显示UID

    有次一个在使用ps命令时,发现部分用户显示的是用户名,有些用户显示的是UID,那是因为用户名长度超过8位的:也就是说ps命令用户名列默认只能显示8位(含8位)的用户名,超过8位就显示UID,如何让长度 ...

  9. 轻量级HTTP服务器Nginx(配置与调试Nginx)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://ixdba.blog.51cto.com/2895551/790611 Nginx ...

  10. 理解JavaScript的prototype和__proto__

    首先,要明确几个点: 1.在JS里,万物皆对象. 方法(Function)是对象,方法的原型(Function.prototype)是对象.因此,它们都会具有对象共有的特点.即:对象具有属性__pro ...