简介

类图是面向对象分析和设计的核心,用来描述系统各个模块中类与类之间、接口与接口之间、类与接口之间的关系,以及每个类的属性、操作等特性,一般在详细设计过程中实施。

类图本身就是现实世界的抽象,是对系统中各种概念进行建模,并描绘出它们之间的关系,所以类图关注的对象就是元素及元素之间的关系。

类图建模步骤

    - 抽象出类实体

    - 识别出类的主要属性

    - 画出类之间的关系

    - 对各个类进行分析、梳理、设计

类图的元素

类图中包含以下几种模型元素:类、接口、关系、协作、注释、约束、包

  在UML的图形表示中,类的表示法是一个矩形,有三格组成,分别是类名、类属性、类操作。抽象类中的类名及抽象方法都用斜体表示。

   - 类名:首字母大写

   - 类属性:格式为可见性 属性名:类型 =默认值,如-name: String

        可见性包括四种:

            +    public

            -  private

            #    protected

            *  package

        属性名:单字属性名小写;多字属性名出第一个单词外其余单词的首字母大写

   - 类操作:格式为可见性 操作名(参数): 返回值类型,如+getName(): String

  • 接口

  在UML的图形表示中,接口的表示法是分为两种:圆形表示法和构造型表示法。

   接口由两栏组成,第一栏顶端是接口名称,第二栏是接口方法。接口无属性只包含操作,且没有对外可见的关联。

      - 圆形表示法

  

      - 构造型表示法

  • 关系

类图中类与类之间有泛化、依赖、关联、聚合、组合关系;接口与接口之间有继承关系;类与接口之间有实现关系。这些关系本身就是类图中的元素,用不同的连线表示。

      - 泛化关系

      - 依赖关系

      - 关联关系

      - 聚合关系

      - 组合关系

      - 实现关系

   类图中的关系较为复杂,以下分别详述。

    

  • 协作

  协作是指一些类、接口、关系等元素提供的交互行为,能够协助其他元素执行活动、实现功能的辅助类。

  • 注释

  对某些类和接口进行注释。

  • 约束

  指定某些类和接口要满足的一个或多个规则,UML中使用花括号括起来的自由文本标识。

  UML中的包直接对应java中的包,用来表示层次和组织内容。

类图的关系

类图中类与类、接口与接口、类与接口之间的关系有四大类:依赖、关联、泛化、实现,其中关联有存在聚合、组合两个特例。

  • 依赖

  依赖是一种单向使用关系,如果一个类为实现某一功能,使用了其他类作为参数或者调用了其他类的方法,这两个类之间就产生了依赖关系。

   依赖关系表现在在一个类中使用另一个类作为局部变量或者方法参数,以及对另一个类静态方法的调用。

   依赖关系又有五种细分类型:绑定(Binding)依赖、实现(Realization)依赖、使用(Usage)依赖、抽象(Abstraction)依赖、授权(Permission)依赖

     绑定依赖

     绑定<<bind>>: 以模板参数指定值,生成一个新的模型元素

     关键字<<bind>>应用于较高级的依赖,用于绑定模板以创建新的模型元素,箭头指向被绑定的模板

     实现依赖

       实现<<realize>>:实际上是两个类/接口之间的契约,也就是说一个类/接口只定义抽象的行为,另一个类定义具体的结构和行为。

     使用依赖

     使用依赖表示客户端使用提供者提供的服务帮助实现自身的功能,通常有以下几种具体应用:

        - 使用<<use>>:比较宽泛的概念,表示一个类的行为或实现会影响到另一个类的行为或者实现

        - 调用<<call>>:在一个类的方法中调用另一个类的操作

        - 参数<<parameter>>:一个类作为另一个类的方法参数

        - 发送<<send>>:用一个类中的方法把信号发送到另一个类

        - 实例化<<instantiate>>:用一个类的方法创建了另一个类的实例

        

     授权依赖

     授权依赖表示一个包/类/元素对另一个包/类/元素进行访问的权限和能力,包含访问、导入、友元等依赖关系:

        - 访问<<access>>:允许一个包/类访问另一个包/类的内容

        - 导入<<import>>:允许一个包/类访问另一个包/类的内容

        - 友元<<friend>>: 允许一个元素访问另一个元素

     抽象依赖

     抽象依赖表示客户端与提供者在不同抽象层次上的关系,包括跟踪、精化、导出等依赖关系:

        - 跟踪<<trace>>:不同模型元素之间的非强相关连接

        - 精化<<refine>>:由基本类分解出更明确、更精细的子类

        - 导出<<derive>>:一个实例可以从另一个实例导出

        

  • 关联

  关联是两个类之间或者类与接口之间的强依赖关系。可以是单向的,也可以是双向的。

关联关系一般长期性的、拥有性的关系,而且双方的关系一般是平等的,如学校与学生之间、老师与学生之间。被关联类B以类的属性形式出现在关联类A中,关联可以是单向的,也可以是双向的。

  

  关联关系在代码上体现为四种形式:

    - 单向关联:单向拥有关系,只有一个类知道另一个类的属性和方法

    - 双向关联:双向拥有关系,双方都知道对方的属性和方法

    - 自身关联:自己关联自己,这种情况比较少但也有用到,如链表

    - 多重性关联:表示两个类的对象在数量上的对应关系,多重性可在关联线上用数字范围表示

          multiplicity: 多重性  

              1      仅为1

              *    从0到无穷大

           0..1    0 或者 1

            n..m    [n, m]之间的任何数

    

UML中使用直线箭头表示,箭头指向为被关联的类,从类A指向类B

单向关联

双向关联

自我关联

多重性关联

  • 聚合

聚合关系是也是关联关系的特例。普通关联关系的两个类一般处于同一平等层次上,而聚合关系的两个类处于不同的层次,是整体与部分的关系。聚合关系中的整体和部分是可以分离的,生命周期也是相互独立的,如公司与员工之间。

  UML中使用空心菱形+实线箭头表示,空心菱形边指向类School(整体),实现箭头边指向部分类Student(部分)

  • 组合

组合关系也是关联关系的特例,属于强聚合,本身也表示整体与部分的关系,但是组合关系中的整体和部分是不可分离的,整体生命周期的结束时也是部分的生命周期到头时。如人和大脑。

聚合和组合其实都是关联的特例,都是整体与部分的关系。它们的区别在于整体和部分是否可分离,聚合的两个对象之间是可分离的,且具有各自的生命周期,而组合的两个对象往往表现为一种同命相连的关系。

  UML中使用实心菱形+实线箭头表示,实心菱形边指向类Person(整体),实线箭头边指向类Brain(部分)

  • 泛化

泛化指的是子类继承父类、或子接口继承父接口的功能并增加自己新功能的过程,是两个类之间耦合度最大的关系之一。父类称为基类或超类,子类也称为派生类。子类可以继承自抽象类或普通类。

  UML中使用实线+空心箭头表示,箭头由子类指向父类、或子接口指向父接口

  • 实现

实现关系是指一个类实现一个或多个接口功能的过程,这里的接口更多的是一种契约或规范。实现是两个类之间或类与接口之间耦合度最大的关系之一,在这种关系中,类实现了接口或接口类中所声明的操作。

  UML中使用虚线+空心箭头表示,箭头由实现类指向接口

类图的高级特性

    

  • 抽象类

抽象类是不能直接实例化的类,UML中不论是抽象类名还是抽象方法都是以斜体表示。在不严格要求的文档中也可以普通类加<<abstract>>前缀的方式标识抽象类名和抽象方法。

  因为是python设计模式,所以方法名采用了更pythonic的写法。

  标准表示法

   构造表示法

   

  • 模板类

UML中引入模板类的目的是应用泛型编程。在类模板声明的时候根据占位符或参数来定义类,而不用说明属性、方法参数、方法返回值的实际类型。使用时通过实际值替代占位符或参数即可创建新类/方法/属性。

  python因为是动态语言的原因,所以泛型在python中没有什么应用场景,以下以Java为例说明模板类的应用。

  • 嵌套类

  嵌套类是在类中定义的类,相应地把拥有嵌套类的类称为外部类。嵌套类和外部类之间耦合度更高,并且与外部类更加紧密,在UML中是Composition的另一种表示。

  • 主动类

  主动类是一种特殊的类,其对象至少拥有一个进程或线程,能够控制活动中的类。之所以使用主动类是因为开发中需要一些类来控制其他类的运行状态。

  • 关联类

  关联类既是关联又是类,它不仅像关联那样连接两个类,而且可以定义一组属于关联本身的特性。

类图注意事项

    - 类图设计初期力求重点突出、简洁易懂,根据需求变化保持更新

    - 类图中的元素名称应该直观、清晰、有意义,不同类的属性名尽量在全图中唯一

    - 类图中多个元素之间有依赖关系时需避免循环依赖

    - 类图中类属性尽量少避免整个图过于繁杂

    - 类图中可适当使用注释使系统更清晰易懂

    - 对于需求频繁变化的项目,可多使用草图进行组内沟通,节省开发和返工时间

Python设计模式 - UML - 类图(Class Diagram)的更多相关文章

  1. Python设计模式 - UML - 组件图(Component Diagram)

    简介 组件图又称构建图,用于显示系统各组件及各组件关系的物理视图. 组件图通常包括组件.接口.关系.端口和连接器,用来显示程序代码中相应的模块.源文件或源文件集合之间的依赖和泛化关系. 组件图中的组件 ...

  2. Python设计模式 - UML - 活动图(Activity Diagram)

    简介 活动图描述从一个活动到另一个活动的执行顺序.约束条件.引用对象及状态结果等方面的控制流,适用于对业务用例.工作流程或程序实现建模. 活动图建模步骤 - 确定活动图的范围和边界,对哪些工作流.哪些 ...

  3. Python设计模式 - UML - 通信图(Communication Diagram)

    简介 通信图表示对象之间的消息往来,是表述时序图中信息交互的另一种UML图,介绍完时序图就要对照学习一下通信图,二者是一体两面的. 通信图和时序图可以相互转换,二者的侧重点不同,通信图侧重哪些对象发送 ...

  4. Python设计模式 - UML - 定时图(Timing Diagram)

    简介 定时图也是一种交互图,用来描述对象或实体随时间变化的状态或值,及其相应的时间或期限约束.定时图应用较广,并不局限于软件工程领域. 定时图侧重与时间线相关的值或状态的改变,这些改变可能来自于收到消 ...

  5. Python设计模式 - UML - 时序图(Sequence Diagram)

    简介 时序图表示参与者与对象之间.对象与对象之间的动态交互过程及时序关系. 时序图详细而直观地展示了对象随时间变化的状态.调用关系和消息时序,时序图中的主要元素有:参与者(Actor), 对象(Obj ...

  6. Python设计模式 - UML - 包图(Package Diagram)

    简介 包图是对各个包及包之间关系的描述,展现系统中模块与模块之间的依赖关系.一个包图可以由任何一种UML图组成,可容纳的元素有类.接口.组件.用例和其他包等.包是UML中非常常用的元素,主要作用是分类 ...

  7. 23种经典设计模式UML类图汇总

    在这里23种经典设计模式UML类图汇总       创建型模式 1.FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基 ...

  8. 设计模式-UML类图的各符号含义(转)

    UML类图的各符号含义 类图基本符号可拆分为虚线,箭头,实线,空心右三角,实心右三角,空心菱形和实心菱形.由这些基本的图形进行组合构成了类图的基本符号.这里要注意这几个符号的顺序,代表了类与类之间关系 ...

  9. php设计模式——UML类图

    前言 用php开发两年多了,准备也写一下平时常用的设计模式,都是基于自己的实践经验,当然,用设计模式之前首先要看懂设计模式,因此这里首先讲解一下UML类图.通过UML类图,能更好的和大家交流,也能很容 ...

随机推荐

  1. ES5与ES6中的继承

    ES5继承在ES5中没有类的概念,所以一般都是基于原型链继承,具体的继承方法有以下几种: 父类: function Father (name) { this.name = name || 'sam' ...

  2. 一款我常用到的手机app

    我从初中开始接触电子书,后来渐渐养成了看电子书的习惯.在阅读电子书的过程中自然要接触到各种各样的阅读类的手机app,比如书旗.qq阅读.百度阅读器等等.个人感觉掌阅使用起来好一些. 首先,它的界面很简 ...

  3. oracle获取连续时间

    SELECT rownum, (to_date('2015-01-01', 'yyyy-mm-dd') + rownum - 1) AS show_time FROM dualCONNECT BY r ...

  4. 使用sshpass方式实现ssh自动登录

    1:sshpass下载地址(用yum安装不了)       https://sourceforge.net/projects/sshpass/files/ or wget http://sourcef ...

  5. MySQL 批量添加

    自己封装的一个批量添加. $data 是一个二维数组.key对应是数据表的字段名: /** * 批量创建 * @param array $data * @return int $res 影响行 * @ ...

  6. python eval()和exec()以及complie()

    1.eval() 函数 eval() 函数用来执行一个字符串表达式,并返回表达式的值. ------->>  eval(expression[, globals[, locals]]) 参 ...

  7. SQLServer、MySQL、Oracle如何查看所有表的条数

    SQLServer: create table #t(name varchar(255), rows bigint, reserved varchar(20), data varchar(20), i ...

  8. 经典笔试题型----IT经理(IT Manager)

    一般企业设置IT部门都是服务性质,虽然谈IT需要成为战略部门许多年,但用脑子想下,这概率有多少?企业存在的第一目标是:赚取利润.贸易型企业最重要的部门为销售部,生产型企业最重要的部门为销售部与生产部, ...

  9. 受限玻尔兹曼机(Restricted Boltzmann Machine, RBM) 简介

    受限玻尔兹曼机(Restricted Boltzmann Machine,简称RBM)是由Hinton和Sejnowski于1986年提出的一种生成式随机神经网络(generative stochas ...

  10. 协程,greenlet,gevent

    """ 协程 """ ''' 协程: 类似于一个可以暂停的函数,可以多次传入数据,可以多次返回数据 协程是可交互的 耗资源大小:进程 --& ...