Python设计模式 - UML - 类图(Class Diagram)

 

 

简介java

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

类图自己就是现实世界的抽象,是对系统中各类概念进行建模,并描绘出它们之间的关系,因此类图关注的对象就是元素及元素之间的关系。编程

 

类图建模步骤设计模式

    - 抽象出类实体spa

    - 识别出类的主要属性线程

    - 画出类之间的关系设计

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

 

类图的元素对象

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

 

   在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的另外一种表示。

 

  • 主动类

   主动类是一种特殊的类,其对象至少拥有一个进程或线程,可以控制活动中的类。之因此使用主动类是由于开发中须要一些类来控制其余类的运行状态。

 

  • 关联类

  关联类既是关联又是类,它不只像关联那样链接两个类,并且能够定义一组属于关联自己的特性。

 

 

 

 

类图注意事项

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

    - 类图中的元素名称应该直观、清晰、有意义,不一样类的属性名尽可能在全图中惟一

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

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

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

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

相关文章
相关标签/搜索