精华内容
下载资源
问答
  • 对象模型图关系
    千次阅读 多人点赞
    2019-03-04 23:05:09

    声 明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
    声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。

    缘起

    个人总结梳理,顺便练练文笔,欢迎点赞!

    开篇有益

    OMD是快速入门ArcEngine的基础,除了要会基础的编程语言,ArcEngine二次开发还需能看懂OMD。

    为什么学习OMD

    A:当然是装逼了!
    B:To young,Too simple!
    

    我个人觉得有如下几点原因:

    1. 工业标准,不看标准直接撸代码的,我敬你们是条汉纸。
    2. OMD可以帮助你整体的学习ArcEngine的架构,OMD相当于是软件的骨骼经脉。
    3. ArcEngine类库那么多,OMD简单易懂的图谱像字典一般帮你快速导航相关的类库。
    4. OMD可以帮助你体验设计大师是如果设计架构的,ArcEngine的OMD中有好多设计模式的理念。
    5. OMD简单清晰的描述了类之间的关系以及类的构造,助你打通经脉。

    学习OMD能知道什么

    A:对象呗,这还有啥不知道的?
    B:你就是个弟弟!
    

    学习OMD我们可以知道如下信息:

    1. 该类支持哪些接口;
    2. 完成任务需要哪些对象;
    3. 如何使用该类的对象;
    4. 是否可以直接实例化类;
    5. 接口有哪些方法和属性;
    6. 是否有其它类也支持该接口;
    7. 对象间的关系

    概念

    UML:全称Unified Modeling Language, 统一建模语言,是用来对软件密集系统进行可视化建模的一种语言。UML为面向对象开发系统的产品进行说明、可视化、和编制文档的一种标准语言(ps:推荐看下《Thinking in UML》)。
    OMD:全称Object model diagrams,对象模型图表。
    ArcObjects/ArcEngine 的OMD参考位置D:\Program Files (x86)\ArcGIS\DeveloperKit10.1\Diagrams
    在这里插入图片描述

    OMD详解

    类和对象

    在UML 图中有三种类型的类:抽象类(abstract class)可创建类(createable class)可实例化类(instantiable class)
    抽象类/AbstractClass不能用以创建新对象,但可以用来指定子类
    *如Layer类就是一个抽象类,不可以直接New Layer()创建新对象。,它知识一个抽象的模板类。

    //Layer是抽象类,不能创建,所以执行此句代码会报错
    ILayer pLyr=new Layer();
    

    可创建类/CoClass指的是那些你能够直接使用开发环境中的对象定义语法来创建对象

    //如FeatureLayer类,你可以直接New FeatureLay
    IFeatureLayer pFeaLyr = new FeatureLayer();
    

    可实例化类/Class不能够直接创建新对象,但是这种类的对象能够作为其它对象的属性被创建或是从其它类的方法中创建。(简单说就是他自己不能创建对象,只能由别人创建它的对象)

    //如Workspace类,只能通过IWorkspaceFactory对象创建IWorkspace对象,不能自己New来创建。
    IWorkspaceFactory pWsFactory = new ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactory();
    IWorkspace pWs = pWsFactory.OpenFromFile(@"D:\0\dlggc.gdb", 0);
    

    类和类之间的关系

    主要包括:依赖关系关联关系组合关系继承关系四中类型

    1. 依赖关系(可实例化)表示一个对象可以产生(实例化)另外一个对象。图中的虚线箭头表示是实例化关系,如Workspace依赖于WorkspaceFactory,可以通过WorkspaceFactory对象创建Workspace对象,不同的WorkspaceFactory对象可以创建不同的Workspace对象,Workspace会随着WorkspaceFactory的不同而不同。
    2. 关联关系指从一个类的对象访问到另外一个类的对象,它是一种松散的关系。图中的线表示是关联关系。有1对1,1对多,多对1,多对多几种关系。如Fields类和Field类,Workspace类和Dataset类。
    3. 组合关系(组成关系)指其中的一个类对象是另外一个类对象的组成部分,体现了严格的部分和整体的关系,部分和整体的生命周期一样。图中的菱形表示是组成关系,如Map类和Layer类,Map有多个图层组成。
    4. 继承关系:同面向对象中的继承。父类不能直接产生类对象,只能通过派生子类的方法来实现自己,是一种比较强的关系。在图中的空心三角箭头表示是继承关系,比如Layer和FeatureLayer之间就是继承关系。
      在这里插入图片描述

    OMD符号

    在这里插入图片描述

    • 抽象类(AbstractClass):二维的内部有阴影的矩形。如:Dataset类
    • 可创建类/组件类(CoClass):带阴影的3D矩形符号。如:FeatureLayer类
    • 可实例化类/普通类(Class):3D矩形内部没有阴影。如:Workspace类
    • 属性(Property):哑铃状的图标,Read(左侧的哑铃)和write(右侧的哑铃)。(建议延伸阅读关于传值传引用的区别
      • 右侧控件的哑铃代表写入的时候传入的是引用(put by value),相当于是C#中的传值。
      • 如果是实心的哑铃代表写入的时候传入的是值或对象的副本(put by reference),简单来说相当于C#中的传引用,比如ref
    • 方法(Method):指向左侧的箭头。
    • 接口(Interface):棒棒糖类型的图标,接口分为内接口和外接口,内接口为空心棒棒糖,外接口为实心棒棒糖。
      • 内接口主要用来组织COM对象相关的方法和属性,COM对象必须实现所有的接口内容;
      • 外接口用来组织与COM对象相关的事件。
    • 图表之间的连接:虫洞。

    接口跳转(QI)

    在COM中,接口中仅定义了方法,而继承该接口的类中实现了该方法。由于一个接口只能使用自己内部定义的方法,不能越界,就好比一个班级一样,这个班级内有班长,有学习委员,有体育委员,每一位干部负责自己职权范围之内的事情,各位干部相互协作,解决班级内的事情。这班级内的每一位干部就相当于一个接口,而这个班级就相当于实现了这些接口的类。当这个班级的一些事情需要班长处理的时候,我们就执行班长这个接口中定义的方法,当需要学习委员处理的话,我们再将执行权交给学习委员这个接口,这也就是接口之间的互相访问(Query Interface)。通过这个我们大体上对QI有了感性上的认识,下面我们通过实例演示一下。
    我定义了两个接口:

    interface IFavoriteFood
    {
       void Food();
        }
    interface IVoice
        {
           void Voice();
    }
    

    然后定义了一个CatClass的类继承这两个接口,并实现这两个接口中的方法:

    class CatClass : IFavoriteFood, IVoice
        {
            public void Food()
           {
           Console.WriteLine("我喜欢吃老鼠。");
       }
        public void Voice()
       {
           Console.WriteLine("喵,喵,喵...");
       }
      }
    

    下面在主函数中调用,代码如下:

    IVoice pVoice = new CatClass();
    pVoice.Voice();//只能调用IVoice中定义的方法
    IFavoriteFood pFavoriteFood = pVoice as IFavoriteFood;//指向同一个类的接口可以相互转化,也就是QI
    pFavoriteFood.Food();//只能调用IFavoriteFood中定义的方法
    Console.ReadLine();
    

    输出结果:
    在这里插入图片描述
    这块其实很好理解,比如一个类实现了两个接口,从一个接口对象跳转到另外一个接口,调用另外一个接口的方法,这就是QI。
    在这里插入图片描述
    学习的过程中你可以写个QI的例子,自己体验一下:

    //创建IWorkspace对象
    
    //用创建好的IWorkspace对象跳转到IDataset对象上,其实就是As转换
    
    //调用IDataset接口中的方法 
    
    

    ArcEngine类库

    ArcObjects组件库有4500多个对象可供开发人员调用, ArcGIS 10.3版本包含的类和接口个数汇总如下:
    在这里插入图片描述
    ArcGIS Engine开发中,为了更好的管理这些COM对象,ESRI将这些COM对象放在不同的组件库中,而它们被物理的放在bin目录下的dll中,而逻辑上被分散到不同的命名空间中,下面我们详细对一些类库进行介绍。

    Version
    Version库是ArcGIS 10新出来的一个类库,该类库包含了将独立应用程序绑定到特定的ArcGIS 系列产品的函数和方法。
    System
    System库是ArcGIS架构中最底层的一个库,它包含了一些被其他库使用的一些组件。
    SystemUI
    SystemUI库定义了一些在ArcGIS中被用户界面组件使用的类型。ICommand和ITool这样的接口就在这里定义。
    Geometry
    Geometry库包含了核心的几何对象,比如点,线,面等。定义和实现了空间参考的对象,包括投影和地理坐标系。
    Display
    Display库包含了支持在输出设备上显示图形的组件,屏幕显示,符号,颜色等都在这个库中定义。
    Controls
    Controls库包含了应用程序开发中用到的控件,包括在控件中使用的命令和工具。
    Carto
    Carto库包含了为数据显示服务的对象。PageLayout和Map对象在这个库中,以及支持各种数据类型的图层,渲染。
    GeoDatabase
    GeoDatabase库包含了所有相关数据组织的定义类型。要素,表,网络,TIN都在这个库中定义。
    DataSourcesFile
    DataSourcesFile库包含了为支持的矢量数据格式提供的工作空间工厂和工作空间。
    DataSourcesGDB
    DataSourcesGDB库包含了为存储在RDBMS中的矢量和栅格数据提供的工作空间工厂和工作空间。
    3D Analyst
    包含了数据的3D分析对象,也包括显示3D数据,在这个库中有一个控件SceneControl可用。
    GlobeCore
    包含了globe数据分析的对象,也包含了显示globe数据,在这个库中有一个控件GlobeControl可用。

    练习

    打开你本地的OMD文件(参考位置D:\Program Files (x86)\ArcGIS\DeveloperKit10.1\Diagrams),打开一个OMD文件,如Geodatabase或Geometry的对象模型图学习学习。

    1. 找到抽象类,可创建类,可实例化类,熟悉他们的符号,以及各自的特点。
    2. 找到类与类之间的四种关系,熟悉他们的符号,以及每种关系的特点。
    3. 查看具体类,查看该类有哪些属性、方法,实现了哪些接口。
    4. 尝试找一段代码,通过OMD来体会理解代码,体会上面三步中的知识点。
    5. 理解QI,尝试利用ArcEngine提供的接口完成一个QI的例子。

    参考

    1. ArcGIS Engine入门教程_第二章_类库介绍
    更多相关内容
  • 两大类数据模型客观对象的抽象过程---两步抽象3.数据模型的组成要素(1)数据结构(2)数据操作(3)数据的完整性约束条件4.概念模型(1)用途与基本要求(2) 信息世界中的基本概念(3)两个实体型之间的联系① 一对一联系(1:1...


    0.思维导图

    在这里插入图片描述

    1.数据模型的概念

    • 在数据库中用数据模型这个工具来抽象、表示和处理现实世界中的数据和信息。
    • 通俗地讲数据模型就是现实世界的模拟

    数据模型应满足三方面要求:

    • 能比较真实地模拟现实世界
    • 容易为人所理解
    • 便于在计算机上实现

    2.两大类数据模型

    数据模型分为两类(分属两个不同的层次)

    • (1) 概念模型 也称信息模型,它是按用户的观点来对数据和信息建模,用于数据库设计。
    • (2) 逻辑模型物理模型
      逻辑模型主要包括网状模型层次模型关系模型面向对象模型等,按计算机系统的观点对数据建模,用于DBMS实现。
      物理模型是对数据最底层的抽象,描述数据在系统内部的表示方式和存取方法,在磁盘或磁带上的存储方式和存取方法。

    客观对象的抽象过程—两步抽象

    • 现实世界中的客观对象抽象为概念模型
    • 概念模型转换为某一DBMS支持的数据模型
      在这里插入图片描述

    3.数据模型的组成要素

    (1)数据结构

    数据结构是所研究的对象类型的集合。这些对象是数据库的组成成分,数据结构指对象和对象间联系的表达和实现,是对系统静态特征的描述,包括两个方面:
    (1)数据本身:类型、内容、性质。例如关系模型中的域、属性、关系等。
    (2)数据之间的联系:数据之间是如何相互关联的,例如关系模型中的主码、外码联系等。

    (2)数据操作

    数据操作

    • 对数据库中各种对象(型)实例(值)允许执行的操作,及有关的操作规则

    数据操作的类型

    • 查询
    • 更新(包括插入、删除、修改)

    (3)数据的完整性约束条件

    • 数据的完整性约束条件是一组完整性规则的集合,规定数据库状态及状态变化所应满足的条件,以保证数据的正确性、有效性和相容性。

    完整性规则:给定的数据模型中数据及其联系所具有的制约和储存规则

    4.概念模型

    (1)用途与基本要求

    概念模型的用途:

    • 概念模型用于信息世界的建模
    • 是现实世界到机器世界的一个中间层次
    • 是数据库设计的有力工具
    • 数据库设计人员和用户之间进行交流的语言

    对概念模型的基本要求:

    • 较强的语义表达能力
    • 能够方便、直接地表达应用中的各种语义知识
    • 简单、清晰、易于用户理解

    (2) 信息世界中的基本概念

    • (1) 实体(Entity)
      客观存在并可相互区别的事物称为实体。
      可以是具体的人、事、物或抽象的概念。
    • (2) 属性(Attribute)
      实体所具有的某一特性称为属性。
      一个实体可以由若干个属性来刻画。
    • (3) (Key)
      唯一标识实体的属性集称为码。
      (4) (Domain)
      属性取值范围称为该属性的域。
    • (5) 实体型(Entity Type)
      实体名及其属性名集合来抽象和刻画同类实体称为实体型
    • (6) 实体集(Entity Set)
      同一类型实体的集合称为实体集
    • (7) 联系(Relationship)
      • 现实世界中事物内部以及事物之间联系在信息世界中反映为实体内部的联系和实体之间的联系。
      • 实体内部的联系通常是指组成实体的各属性之间的联系
      • 实体之间的联系通常是指不同实体集之间的联系

    (3)两个实体型之间的联系

    在这里插入图片描述

    ① 一对一联系(1:1)

    实例

    • 一个班级只有一个正班长
    • 一个班长只在一个班中任职
      在这里插入图片描述

    定义:
    如果对于实体集A中的每一个实体,实体集B中至多有一个(也可以没有)实体与之联系,反之亦然。则称实体集A与实体集B具有一对一联系,记为1:1

    ② 一对多联系(1:n)

    实例

    • 一个班级中有若干名学生,
    • 每个学生只在一个班级中学习
      在这里插入图片描述
      定义:
      如果对于实体集A中的每一个实体,实体集B中有n个实体(n≥0)与之联系,反之,对于实体集B中的每一个实体,实体集A中至多只有一个实体与之联系,则称实体集A与实体集B有一对多联系,记为1:n

    ③ 多对多联系(m:n)

    实例

    • 课程与学生之间的联系:
    • 一门课程同时有若干个学生选修
    • 一个学生可以同时选修多门课程
      在这里插入图片描述
      定义:
      如果对于实体集A中的每一个实体,实体集B中有n个实体(n≥0)与之联系,反之,对于实体集B中的每一个实体,实体集A中也有m个实体(m≥0)与之联系,则称实体集A与实体B具有多对多联系,记为m:n

    (4)两个以上实体型之间的联系

    ① 一对多联系(1:m||1:n)

    • 若实体集E1,E2,…,En存在联系,对于实体集Ej(j=1,2,…,i-1i+1,…,n)中的给定实体,最多只和Ei中的一个实体相联系,则我们说Ei与E1E2,…,Ei-1,Ei+1,…,En之间的联系是一对多的。

    实例

    • 课程、教师与参考书三个实体型
      一门课程可以有若干个教师讲授,
      使用若干本参考书,
      每一个教师只讲授一门课程,
      每一本参考书只供一门课程使用

    在这里插入图片描述

    ② 一对一联系(1:1:1)

    实例

    • 一个独生子女只有一个父亲,一个母亲
    • 一个父亲也只有一个独生子女
    • 一个母亲也只有一个独生子女
      在这里插入图片描述

    ③ 多对多联系(m:n:p)

    实例
    供应商、项目、零件三个实体型
    一个供应商可以供给多个项目多种零件
    每个项目可以使用多个供应商供应的零件
    每种零件可由不同供应商供给
    在这里插入图片描述

    (5)单个实体型内的联系

    ① 一对多联系(1:n)

    实例
    职工实体型内部具有领导与被领导的联系
    某一职工(干部)“领导”若干名职工
    一个职工仅被另外一个职工直接领导
    这是一对多的联系

    在这里插入图片描述

    ② 一对一联系(1:1)

    • 身份证可以唯一确认一个人的身份,人与身份证有确认和被确认的关系
    • 一个身份证唯一确定一个人
    • 一个人也唯一确认一个身份证
      在这里插入图片描述

    ③ 多对多联系 (m:n)

    • 饮料和厂商之间有制造和被制造的关系
    • 多个饮料可以被多个厂商制造
    • 多个厂商可以制造出多种饮料
      在这里插入图片描述

    (6)概念模型的一种表示方法

    ① 实体-联系方法(E-R方法)

    • E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用E-R图来描述现实世界的概念模型
    • E-R方法也称为E-R模型

    ② 实体型

    用矩形表示,矩形框内写明实体名。
    在这里插入图片描述

    ③ 属性

    用椭圆形表示,并用无向边将其与相应的实体连接起来
    在这里插入图片描述

    ④ 联系

    • 联系本身:
      用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体连接起来,同时在无向边旁标上联系的类型(1:1、1:n或m:n)
      在这里插入图片描述

    ⑤ 联系的表示方法

    在这里插入图片描述

    ⑥ 联系的表示方法示例

    在这里插入图片描述

    ⑦ 联系的属性

    • 联系本身也是一种实体型也可以有属性。如果一个联系具有属性,则这些属性也要用无向边与该联系连接起来
      在这里插入图片描述

    ⑧ 一个实例

    用E-R图表示某个工厂物资管理的概念模型

    • 实体
      仓库: 仓库号、面积、电话号码
      零件 :零件号、名称、规格、单价、描述
      供应商:供应商号、姓名、地址、电话号码、帐号
      项目:项目号、预算、开工日期
      职工:职工号、姓名、年龄、职称

    实体之间的联系如下:

    • (1)一个仓库可以存放多种零件,一种零件可以存放在多个仓库中。仓库和零件具有多对多的联系。用库存量来表示某种零件在某个仓库中的数量。
      (2)一个仓库有多个职工当仓库保管员,一个职工只能在一个仓库工作,仓库和职工之间是一对多的联系。职工实体型中具有一对多的联系
      (3)职工之间具有领导-被领导关系。即仓库主任领导若干保管员。
      (4)供应商、项目和零件三者之间具有多对多的联系
      在这里插入图片描述

    5.非关系模型

    (1)层次模型(Hierarchical Model)

    • 层次模型是数据库系统中最早出现的数据模型
    • 层次数据库系统的典型代表是IBM公司的IMS(Information Management System)数据库管理系统
    • 层次模型用树形结构来表示各类实体以及实体间的联系

    ① 数据结构

    满足下面两个条件的基本层次联系的集合为层次模型

    • 有且只有一个结点没有双亲结点,这个结点称为根结点
    • 根以外的其它结点有且只有一个双亲结点

    层次模型中的几个术语
    根结点,双亲结点,兄弟结点,叶结点
    在这里插入图片描述

    ② 特点

    • 结点的双亲是唯一
    • 只能直接处理一对多的实体联系
    • 每个记录类型可以定义一个排序字段,也称为·码字段
    • 任何记录值只有按其路径查看时,才能显出它的全部意义
    • 没有一个子女记录值能够脱离双亲记录值而独立存在

    在这里插入图片描述
    在这里插入图片描述

    ③ 多对多联系在层次模型中的表示

    方法:

    • 将多对多联系分解成一对多联系

    分解方法:

    • 冗余结点法
    • 虚拟结点法

    ④ 数据操纵与完整性约束

    层次模型的数据操纵:

    • 查询
    • 插入
    • 删除
    • 更新

    层次模型的完整性约束条件:

    • 无相应的双亲结点值就不能插入子女结点值
    • 如果删除双亲结点值,则相应的子女结点值也被同时删除
    • 更新操作时,应更新所有相应记录,以保证数据的一致性

    ⑤ 存储结构

    邻接法:
    按照层次树前序遍历(T-L-R)的顺序把所有记录值依次邻接存放,即通过物理空间的位置相邻来实现层次顺序。又可分为:子女-兄弟链接法层次序列链接法

    在这里插入图片描述

    ❶ 子女-兄弟链接法
    • 每个记录设两类指针,分别指向最左边的子女(每个记录型对应一个)和最近的兄弟
      在这里插入图片描述
    ❷ 层次序列链接法
    • 按树的前序穿越顺序链接各记录值
      在这里插入图片描述

    ⑥ 优缺点

    • 优点:
      层次模型的数据结构比较简单清晰
      查询效率高,性能优于关系模型,不低于网状模型
      层次数据模型提供了良好的完整性支持
    • 缺点:
      多对多联系表示不自然
      插入删除操作的限制多,应用程序编写比较复杂
      查询子女结点必须通过双亲结点
      由于结构严密,层次命令趋于程序化

    (2)网状模型(Network Model)

    网状数据库系统采用网状模型作为数据的组织方式

    • 典型代表是DBTG系统:
      亦称CODASYL系统
      70年代由DBTG提出的一个系统方案
      奠定了数据库系统的基本概念、方法和技术
    • 实际系统:
      Cullinet Software Inc.公司的 IDMS
      Univac公司的 DMS1100
      Honeywell公司的IDS/2
      HP公司的IMAGE

    ① 数据结构

    网状模型:
    满足下面两个条件的基本层次联系的集合:

    1. 允许一个以上的结点无双亲;
    2. 一个结点可以有多于一个的双亲。

    表示方法(与层次数据模型相同):
    实体型:用记录类型描述
    每个结点表示一个记录类型(实体)
    属性:用字段描述
    每个记录类型可包含若干个字段
    联系:用结点之间的连线表示记录类型(实体)之
    间的一对多的父子联系

    网状模型与层次模型的区别:

    • 网状模型允许多个结点没有双亲结点
    • 网状模型允许结点有多个双亲结点
    • 网状模型允许两个结点之间有多种联系(复合联系)
    • 网状模型可以更直接地去描述现实世界
    • 层次模型实际上是网状模型的一个特例

    网状模型中子女结点与双亲结点的联系可以不唯一
    要为每个联系命名,并指出与该联系有关双亲记录子女记录
    在这里插入图片描述
    在这里插入图片描述

    多对多联系在网状模型中的表示:
    方法:将多对多联系直接分解成一对多联系

    例如:一个学生可以选修若干门课程,·某一课程可以被多个学生选修,学生与课程之间是多对多联系 ·

    • 引进一个学生选课的联结记录,由3个数据项组成
      学号
      课程号
      成绩
      表示某个学生选修某一门课程及其成绩

    在这里插入图片描述

    ② 网状数据模型的操纵与完整性约束(续)

    网状数据库系统(如DBTG)对数据操纵加 了一些限制,提供了一定的完整性约束

    • :唯一标识记录的数据项的集合
    • 一个联系中双亲记录子女记录之间是一对多联系
    • 支持双亲记录和子女记录之间某些约束条件

    ③ 存储结构

    关键:

    • 实现记录之间的联系

    常用方法:

    • 单向链接
    • 双向链接
    • 环状链接
    • 向首链接

    在这里插入图片描述

    ④ 优缺点

    • 优点
      能够更为直接地描述现实世界,如一个结点可以有多个双亲;
      具有良好的性能,存取效率较高;

    • 缺点
      结构比较复杂,而且随着应用环境的扩大,数据库的结构就变得越来越复杂,不利于最终用户掌握;
      DDL、DML语言复杂,用户不容易使用;

    6.关系模型

    关系数据库系统采用关系模型作为数据的组织方式
    1970年美国IBM公司San Jose研究室的研究员E.F.Codd首次提出了数据库系统的关系模型
    计算机厂商新推出的数据库管理系统几乎都支持关系模型

    (1)数据结构

    在用户观点下,关系模型中数据的逻辑结构是一张二维表,它由组成。
    几个名词解释:

    • 关系(Relation)
      一个关系对应通常说的一张表

    • 元组(Tuple)
      表中的一行即为一个元组

    • 属性(Attribute)
      表中的一列即为一个属性,给每一个属性起一个名称即属性名

    • 主码(Key)
      表中的某个属性组,它可以唯一确定一个元组

    • (Domain)
      属性的取值范围。

    • 分量
      元组中的一个属性值。

    • 关系模式
      对关系的描述
      关系名(属性1,属性2,…,属性n)
      学生(学号,姓名,年龄,性别,系,年级)
      在这里插入图片描述
      举几个例子:

    • 例1
      学生、系、系与学生之间的·一对多联系:
      学生(学号,姓名,年龄,性别,系号,年级)
      系 (系号,系名,办公地点)

    • 例2
      系、系主任、系与系主任间的一对一联系

    • 例3
      学生、课程、学生与课程之间的多对多联系:
      学生(学号,姓名,年龄,性别,系号,年级)
      课程(课程号,课程名,学分)
      选修(学号课程号,成绩)

    规范化:

    • 关系必须是规范化的,满足一定的规范条件
    • 最基本的规范条件:关系的每一个分量必须是一个不可分的数据项, 不允许表中还有表
    • 图1.27中工资和扣除是可分的数据项 ,不符合关系模型要求
      在这里插入图片描述

    在这里插入图片描述

    (2)关系数据模型的操纵与完整性约束

    • 数据操作是集合操作,操作对象和操作结果都是关系
      查询
      插入
      删除
      更新

    • 数据操作是集合操作,操作对象和操作结果都是关系,即若干元组的集合存取路径对用户隐蔽,用户只要指出“干什么”,不必详细说明“怎么干”

    • 关系的完整性约束条件
      实体完整性
      参照完整性
      用户定义的完整性

    (3)存储结构

    • 实体及实体间的联系都用来表示
    • 表以文件形式存储
      有的DBMS一个表对应一个操作系统文件;
      有的DBMS自己设计文件结构;

    (4)优缺点

    • 优点
      • 建立在严格的数学概念的基础上;
      • 概念单一:
        实体和各类联系都用关系来表示;
        对数据的检索结果也是关系;
      • 关系模型的存取路径对用户透明;
        具有更高的数据独立性,更好的安全保密性
        简化了程序员的工作和数据库开发建立的工作;
    • 缺点
      • 存取路径对用户透明导致查询效率往往不如非关系数据模型;
      • 为提高性能,必须对用户的查询请求进行优化,增加了开发DBMS的难度;

    7.面向对象数据模型

    • 语义数据模型面向对象程序设计方法结合起来,用面向对象观点来描述现实世界实体(对象)的逻辑组织对象间限制联系等的模型

    • 一系列面向对象核心概念构成了面向对象数据模型( Object Oriented Data Model, 00模型)的基础,主要包括以下一些概念:

      • (1)现实世界中的任何事物都被建模为对象。每个对象具有一个唯一的对象标识
        (OID)。
      • (2)对象是其状态和行为的封装,其中状态是对象属性值的集合,行为是变更对象状
        态的方法集合。
      • (3)具有相同属性和方法的对象的全体构成了类,类中的对象称为类的实例。
      • (4)类的属性的定义域也可以是类,从而构成了类的复合。类具有继承性,一个类可以继承另一个类的属性与方法,被继承类和继承类也称为超类和子类。类与类之间的复合与继承关系形成了一个有向无环图,称为类层次。
      • (5)对象是被封装起来的,它的状态和行为在对象外部不可见,从外部只能通过对象显式定义的消息传递对对象进行操作。
    • 面向对象数据库(OODB)的研究始于20世纪80年代,有许多面向对象数据库产品相继问世,较著名的有Object Store、02、ONTOS等。

    • 与传统数据库一样,面向对象数据库系统对数据的操纵包括数据查询、增加、删除、修改等,也具有并发控制、故障恢复、存储管理等完整的功能。不仅能支持传统数据库应用,也能支持非传统领域的应用,包括CAD/CAM、OA、CIMS、GIS以及图形、图像等多媒体领域、工程领域和数据集成等领域。

    • 尽管如此,由于面向对象数据库操作语言过于复杂,没有得到广大用户,特别是开发人员的认可,加上面向对象数据库企图完全替代关系数据库管理系统的思路,增加了企业系统升级的负担,客户不接受,·面向对象数据库产品终究没有在市场上获得成功。

    8.对象关系模型

    • 对象关系数据库系统(Object Relational DataBase System, ORDBS) 是关系数据库面向对象数据库的结合。
    • 它保持了关系数据库系统的非过程化数据存取方式和数据独立性,继承了关系数据库系统已有的技术,支持原有的数据管理,又能支持00模型和对象管理。各数据库厂商都在原来的产品基础上进行了扩展。
    • 1999 年发布的SQL标准(也称为SQL99),增加了SQL/Object Language Binding, 提供了面向对象的功能标准。SQL99对ORDBS标准的制定滞后于实际系统的实现。所以各个ORDBS产品在支持对象模型方面虽然思想一致,但是所采用的术语、语言语法、扩展的功能都不尽相同。
    展开全文
  • JVM成神之路-Java对象模型

    千次阅读 2018-07-23 15:01:17
    在jvm的内存结构中,对象保存在堆中,而我们在对对象进行操作时,其实操作的是对象的引用。 Java对象包含三个部分 一个Java对象可以分为三部分存储在内存中,分别是:对象头(Header)、实例数据(Instance Data)和...

    首先我们要知道:

    在jvm的内存结构中,对象保存在堆中,而我们在对对象进行操作时,其实操作的是对象的引用。

    Java对象包含三个部分

    一个Java对象可以分为三部分存储在内存中,分别是:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。

    1. 对象头(包含锁状态标志,线程持有的锁等标志)
    2. 实例数据
    3. 对齐填充

    oop-klass model(hotspot jvm中的对象模型)

    Java虚拟机的底层是使用c++实现,而jvm并没有根据一个Java的实例对象去创建对应的c++对象,而是设计了一个oop-klass model ;

    1. OOP(Ordinary Object Pointer):普通对象指针; 表示一个实例信息
    2. Klass:描述对象实例的具体类型, 含了元数据和方法信息
    3. 创建目的:不想让每个对象中都含有一个vtable(虚函数表)

    类就是一类事物的抽象概括。

    OOP体系:

    1. OOPs模块中包含了多个子模块,每个子模块对应一个类型,每一个类型的OOP都代表一个在JVM内部使用的特定对象的类型。
    2. 在Java程序运行过程中,每创建一个新的对象,在JVM内部就会相应的创建一个对应类型的OOP对象。

    代码:

    1. typedef class oopDesc* oop;

    // 定义了oop共同的基类,其他的类型都是它的子类

    1. typedef class instanceOopDesc* instanceOop;

    /* 表示一个Java类型实例,每当我们new一个对象时,

    JVM都会创建一个instanceOopDesc */

    1. typedef class methodOopDesc* methodOop;

    // 表示一个Java方法

    1. typedef class constMethodOopDesc* constMethodOop;

    // 表示一个Java方法中的不变信息

    1. typedef class MethodDataOopDesc* methodDataOop;

    // 记录性能信息的数据结构

    1. typedef class arrayOopDesc* arrayOop;

    /* 定义了数组oops的抽象基类,下面两个类相当于此类的子类,

    new一个数组时会建立此对象*/

    1. typedef class objArrayOopDesc* objArrayOop;

    // 表示持有一个oops数组,对应存储对象的数组

    1. typedef class typeArrayOopDesc* typeArrayOop;

    // 表示容纳基本类型的数组,对应存储基本类型的数组

    1. typedef class constantPoolOopDesc* constantPoolOop;

    // 表示在class文件中描述的常量池

    1. typedef class constantPoolCacheOopDesc* constantPoolCacheOop;

    // 常量池缓存

    1. typedef class klassOopDesc* klassOop;

    // 描述一个与Java类对等的C++类

    1. typedef class markOopDesc* markOop;

    // 表示对象头

    OopDesc结构:

    class oopDesc {

     friend class VMStructs;

            private:

    /*

    * 实际上也是代表了instanceOopDesc、arrayOopDesc和OopDesc

    * 包含了markOop _mark和union_matadata两部分

    */

    volatile markOop _mark; // 保存锁标记、gc分代等信息

    union _metadata { wideKlassOop _klass; // 普通指针,

    // 压缩类指针,和普通指针都指向instanceKlass 对象

    narrowOop _compressed_klass; } _metadata;

    private:

     // 实例数据保存的位置

    void* field_base(int offset) const;

    jbyte* byte_field_addr(int offset) const;

    jchar* char_field_addr(int offset) const;

    jboolean* bool_field_addr(int offset) const;

    jint* int_field_addr(int offset) const;

    jshort* short_field_addr(int offset) const;

    jlong* long_field_addr(int offset) const;

    jfloat* float_field_addr(int offset) const;

    jdouble* double_field_addr(int offset) const;

    address* address_field_addr(int offset) const; }

    /* instanceOopDesc和arrayOopDesc都直接继承了oopDesc,

    都没有增加其他的数据结构 */

    class instanceOopDesc : public oopDesc {

    }

    class arrayOopDesc : public oopDesc { }

    1. 职能:表示对象的实例数据,不含任何虚函数
    2. 对象在内存中的基本形式就是oop
    3. 对象所属的类也是一种oop,即klassOop,对应的klass是klassKlass

    Klass体系:

    结构:

    • class Klass;

    // klassOop的一部分,用来描述语言层的类型,其他所有类的父类

    • class instanceKlass;

    // 在虚拟机层面描述一个Java类,每一个已加载的Java类都会创建一个此对象,

    // 在JVM层表示Java类

    • class instanceMirrorKlass;

    // 专有instantKlass,表示java.lang.Class的Klass

    • class instanceRefKlass;

    // 专有instantKlass,表示java.lang.ref.Reference的子类的Klass

    • class methodKlass; // 表示methodOop的Klass
    • class constMethodKlass; // 表示constMethodOop的Klass
    • class methodDataKlass; // 表示methodDataOop的Klass
    • class klassKlass; // 最为klass链的端点,klassKlass的Klass就是它自身
    • class instanceKlassKlass; // 表示instanceKlass的Klass
    • class arrayKlassKlass;

    // 表示arrayKlass的Klass

    • class objArrayKlassKlass; // 表示objArrayKlass的Klass
    • class typeArrayKlassKlass; // 表示typeArrayKlass的Klass
    • class arrayKlass; // 表示array类型的抽象基类
    • class objArrayKlass; // 表示objArrayOop的Klass
    • class typeArrayKlass; // 表示typeArrayOop的Klass
    • class constantPoolKlass; // 表示constantPoolOop的Klass
    • class constantPoolCacheKlass;

    // 表示constantPoolCacheOop的Klass

    功能:

        • 实现语言层面的Java类(在Klass基类中已经实现)
        • 实现Java对象的分发功能(由Klass子类提供虚函数实现)

    目的:为了实现虚函数多态,提供了虚函数表。

    • instanceKlass的内部结构:
    • objArrayOop _methods;

    // 类拥有的方法

    • typeArrayOop _method_ordering;

    //描述方法顺序

    • objArrayOop _local_interfaces;

    //实现的接口

    • objArrayOop _transitive_interfaces;

    //继承的接口

    • typeArrayOop _fields;

    //域

    • constantPoolOop _constants;

    //常量

    • oop _class_loader;

    //类加载器

    • oop _protection_domain;

    //protected域

    ....

    HotSpotJVM的设计这把对象一拆为二,分为Klass和oop,其中oop的只能主要在于表示对象的实例数据,所以其中不含有任何虚函数,而klass为了实现虚函数多态,所以提供了虚函数表。所以,关于java的多态,其实也有虚函数的影子在。

    instanceKlass

    JVM在运行时,需要一种用来标识Java内部类型的机制。在HotSpot中的解决方案是:为每一个已加载的Java类创建一个instanceKlass对象,用来在JVM层表示Java类。

    结构:

    //类拥有的方法列表

      objArrayOop     _methods;

      //描述方法顺序

      typeArrayOop    _method_ordering;

      //实现的接口

      objArrayOop     _local_interfaces;

      //继承的接口

      objArrayOop     _transitive_interfaces;

      //域

      typeArrayOop    _fields;

      //常量

      constantPoolOop _constants;

      //类加载器

      oop             _class_loader;

      //protected域

      oop             _protection_domain;

          ....

    在JVM中,对象在内存中的基本存在形式就是oop。那么,对象所属的类,在JVM中也是一种对象,因此它们实际上也会被组织成一种oop,即klassOop。同样的,对于klassOop,也有对应的一个klass来描述,它就是klassKlass,也是klass的一个子类。

    klassKlass作为oop的klass链的端点。关于对象和数组的klass链大致如下图:

    oop-klass-klassKlass关系图:

    符号引用

    符号引用就是用一组符号来描述所引用的目标,我们都知道在Java中,通常情况下我们写的一个Java类被编译以后都是一个class文件,在编译的时候,Java类并不知道所引用的类的实际地址,因此只能使用符号引用来代替。

    一般一个对象的创建就是从new开始的,而操作这些创建指令的就是jvm了,首先当你开始new的时候,jvm会先去查找一个符号引用,如果找不到这个符号引用就说明这个类还没有被加载,因此jvm就会进行类加载,然后符号引用被解析完成,紧接着jvm会为对象在堆内存中分配内存,也就是说我们这个user对象就在堆内存中有一块内存空间了。

    HotSpot虚拟机实现的Java对象包括三个部分:对象头,实例字段和对齐填充

    为对象分配完堆内存之后,jvm会将该内存进行零值初始化。

    内存存储:

    关于一个Java对象,他的存储是怎样的,一般很多人会回答:对象存储在堆上。稍微好一点的人会回答:对象存储在堆上,对象的引用存储在栈上。今天,再给你一个更加显得牛逼的回答:

    对象的实例(instantOopDesc)保存在堆上,对象的元数据(instantKlass)保存在方法区,对象的引用保存在栈上。

    其实如果细追究的话,上面这句话有点故意卖弄的意思。因为我们都知道。方法区用于存储虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 所谓加载的类信息,其实不就是给每一个被加载的类都创建了一个 instantKlass对象么。

    示例

    class Model{
    public static int a = 1;
    private final int NUMBER = 2;
    public int b;
    public int c = 3;
    
    public Model(int b){
    this.b = b;
    }
    
    public static void main(String[] args){
    int d = 10;
    Model modelA = new Model(2);
    Model modelB = new Model(3);
    }
    }
    

    存储结构:

    总结:

    在Java中,JVM中的对象模型包含两部分:Oop和Klass,在类被加载的时候,JVM会给类创建一个instanceKlass,其中包含了类信息、常量、静态变量、即时编译器编译后的代码等,存储在方法区,用来在JVM层表示该Java类。而使用new一个对象后,JVM就会创建一个instanceOopDesc对象,该对象包含对象头和实例数据,对象头中保存的是锁的状态标志等信息,元数据则实际上是一个指针,指向instanceKlass

    Java对象模型---对象头(Mark Word)

    对象自身的运行时数据

    这部分存储包括哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。这部分数据被官方称为Mark Word,在32位和64位的虚拟机中的大小分别为32bit和64bit。

    由于对象头信息是与对象自身定义的数据无关的额外存储成本,考虑到虚拟机的空间效率,Mark Word被设计成一个非固定的数据结构以提高存储空间的利用率。即这部分数据会根据对象的状态来分配存储空间。

    对象的类型指针

    即指向对象的类元数据的指针。虚拟机可以通过该指针判定对象实例属于哪个类。

    在Java对象中比较特殊的是Java数组,一个数组实例的对象头中必须记录数组的长度。JVM可以通过对象头中的数组长度数据来判定数组的大小,这是访问数组类型的元数据无法得到的。

    对象的实例数据

    前面提到对象头是对象的额外开销,只有实例数据才是一个对象实例存储的有效信息,也是在程序代码中所定义的各种类型的字段内容。这部分内容同时记录了子类从父类继承所得的各类型数据。

    填充

    对齐填充在对象数据中并不是必然的,只是起着占位符的作用,没有特别含义。HotSpot要求对象起始地址必须是8字节的整数倍。对象头的大小刚好符合要求,因此当实例数据没有对齐时,就需要通过填充来对齐数据。

    获取类的元数据

    虚拟机在加载类的时候会将类的信息、常量、静态变量和即时编译器编译后的代码等数据存储在方法区(Method Area)。类的元数据,即类的数据描述,也被存在方法区。我们知道对象头中会存有对象的类型指针,通过类型指针可以获取类的元数据。因此,对象的类型指针其实指向的是方法区的某个存有类信息的地址。

    但是,并不是每个对象实例都存有对象的类型指针。根据对象访问定位方法的不同,对象的类型指针被存放在不同的区域。

    • 通过句柄访问对象
      • 对象的类型指针被存放在句柄池中;
    • 通过Reference指针直接访问对象
      • 对象的类型指针被存放在对象本身的数据中。

    比较来说:

    • 使用句柄访问的最大好处就是reference中存储的是稳定的句柄地址,当对象被移动(垃圾收集时会经常移动对象)时智慧改变句柄中实例数据执政,而reference本身不需要修改。
    • 使用直接指针访问方式的最大好处就是速度快,节省了一次指针定位的时间开销(对象的访问在java中也非常频繁)

    因此,Java的对象数据存储可以理解为:

    • 引用类型(指向对象的Reference)
      • 存储在栈中
    • 对象的类的元数据 (Class MetaData)
      • 存储在方法区中
    • 对象的实例数据
      • 存储在堆中

    对象内存布局

    • 存储的是与对象本身定义的数据无关的额外存储成本,其数据结构不固定。
    • 32位JVM中,对象不同装填的mark word各个比特位区间图示如下:

    对象五种状态:无锁态、轻量级锁、重量级锁、GC标记和偏向锁。

    HotSpot中对象头主要包含两部分

    第一:

    用于存储对象自身的运行时数据,如上表中的对象哈希码,对象分代年龄,偏向线程id,偏向时间戳等。

    第二:

    类型指针了,我们看表中也有指针字样,那么这部分主要就是杜希昂指向它的类元数据的指针了,虚拟机就是通过这个指针来确定这个对象时那个实例。

    偏向锁和重量级锁

    • 偏向锁:主要解决无竞争下的锁性能问题
      • 按照HotSpot设计,每次加锁/解锁都会涉及到一些CAS操作,CAS操作会延迟本地调用
      • 偏向锁会偏向第一个访问锁的程序,如果接下来的运行过程中,该锁没有被其他线程访问,则持有偏向锁的线程将永远不需要触发同步。
      • 但是如果在运行过程中,遇到了其他线程抢占锁,则持有偏向锁的线程会被挂起,JVM会尝试消除它身上的偏向锁,将锁恢复到标准的轻量级锁
      • 只能在单线程中起作用
    • 轻量级锁:为了在无多线程竞争的环境中使用CAS来替代synchronized。减少传统的重量级锁使用操作系统互斥量产生的性能消耗,是为了减少多线程进入互斥的几率。并非替代互斥。

    参考资料:

    《深入理解Java虚拟机》

    http://www.cnblogs.com/chenyangyao/p/5245669.html

    深入理解多线程(二)—— Java的对象模型-HollisChuang's Blog

    深入理解多线程(三)—— Java的对象头-HollisChuang's Blog

     

    展开全文
  • UML模型图

    千次阅读 2020-10-24 21:11:58
    一. 静态模型 1. 用例 2. 类图 ...3. 对象图 4. 部署 5. 组件 二. 动态模型 1. 用例 2. 状态 3. 活动 4. 序列 5. 协作 三. UML机制 四. UML建模 五. 建模工具

    一. 静态模型

    1. 用例图

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2. 类图

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    (1). 关联关系(association)

    表示对象之间的联系

    描述类的结构之间的关系。具有方向、名字、角色和多重性等信息。一般的关联关系语义较弱。也有两种语义较强,分别是聚合与组合

    表示类与类之间的连接,它使得一个类知道另外一个类的属性和方法。

    关联可以使用单箭头表示单向关联,使用双箭头或者不适用箭头表示双向关联,不建议使用双向关联,关联有两个端点,每个端点可以有一个基数,表示这个关联的类可以有几个实例。

    0..1 表示可以有0个或者1个实例
    
    0..* 表示对实例的数目没有限制
    
    1     表示只能有一个实例
    
    1..* 表示至少有一个实例
    

    在这里插入图片描述
    关联关系体现的是两个类,或者类与接口之间的强依赖关系,这种关系很强烈,比依赖更强,不是偶然性的,也不是临时性的,而是一种长期性,相对平等的关系

    表现在代码层面,为被关联的类B以类属性的形式出现在类A中,也可能是关联类A引用了被关联类B的全局变量。

    在Java中,关联关系是使用实例变量来实现的
    
    比如:学生与课程之间就是通过选课关系进行关联
    

    (2). 聚合关系(aggregation)

    特殊关联关系,指明一个聚集(整体)和组成部分之间的关系

    表示两个类之间是“is part of”关系,即整体–部分关系。

    是关联关系的特例,是强的关联关系,聚合是整个与个体的关系,即has-a关系,
    此时整体和部分是可以分离的,他们具有各自的生命周期,部分可以属于多个对象,也可以被多个对象共享

    比如计算机和CPU,公司与员工的关系
    
    在代码层面聚合与关联是一致的,只能从语义上来区分。
    

    在这里插入图片描述

    (3). 组合关系(compostion)

    语义更强的聚合,部分和整体具有相同的生命周期

    组合关系应该是A类的属性中含有一个B的对象;构成has a关系

    也是关联关系的一种特例,体现的是一种contain-a关系,比聚合更强,是一种强聚合关系。它同样体现整体与部分的关系,但此时整体与部分是不可分的,整体生命周期的结束也意味着部分生命周期的结束

    体现在代码层面与关联时一致的,只能从语义来区分。
    

    它表示部分对象被嵌入到整体对象中。

    比如:引擎是飞机的一部分;大脑和人类
    

    在这里插入图片描述

    (4). 泛化关系(继承关系)(generalization)

    在面向对象中一般称为继承关系,存在于父类与子类、父接口与子接口之间

    关系时指一个类(子类、子接口)继承另外一个类(称为父类、父接口)的功能,并可以增加它自己新功能的能力,继承是类与类或者接口与接口最常见的关系,在Java中通过关键字extends来表示

    在这里插入图片描述

    (5). 实现关系(realization)

    对应于类和接口之间的关系

    是指一个class实现interface接口(一个或者多个),表示类具备了某种能力,实现是类与接口中最常见的关系,在Java中通过implements关键字来表示。

    在这里插入图片描述

    (6). 依赖关系(dependency)

    表示类与类之间的连接,表示一个类依赖于另外一个类的定义,依赖关系时是单向的。简单理解就是类A使用到了类B,这种依赖具有偶然性、临时性,是非常弱的关系。但是类B的变化会影响到类A。

    举个例子,如某人要过河,则人与船的关系就是依赖,人过河之后,与船的关系就解除了,
    因此是一种弱的连接。在代码层面,为类B作为参数被类A在某个方法中使用。
    
    在java中,依赖表现为:局部变量,方法中的参数和对静态方法的调用。
    

    在这里插入图片描述

    (7). 几种关系强弱比较

    泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖

    在这里插入图片描述

    3. 对象图

    对象图是系统在某一时刻的快照。

    4. 部署图

    部署图描述系统资源运行时的物理分布,系统资源成为结点

    部署图用于静态建模,是表示运行时过程节点结构、构件实例及其对象结构的图。

    如果含有依赖关系的构件实例放置在不同节点上,部署视图可以展示出执行过程中的瓶颈。

    部署图的两种表现形式:实例层部署图和描述层部署图

    在这里插入图片描述

    部署图与构件图相同的构成元素:

    构件、接口、构件实例、构件向外提供服务、构件要求外部提供的服务。
    

    部署图与构件图的关系:

    部署图表现构件实例;
    构件图表现构件类型的定义。
    
    部署图偏向于描述构件在节点中运行时的状态,描述了构件运行的环境;
    构件图偏向于描述构件之间相互依赖支持的基本关系。
    

    5. 组件图

    组件图描述可重用的系统组件及组件间的依赖

    构件图用于静态建模,是表示构件类型的组织以及各种构件之间依赖关系的图。

    构件图通过对构件间依赖关系的描述来估计对系统构件的修改给系统可能带来的影响。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    二. 动态模型

    在这里插入图片描述

    1. 用例图

    用例图描述执行者在各个用例中的参与情况

    用例图的功能:

    捕获系统用户需求
    描述系统边界
    指明系统外部行为
    指导系统开发者的功能开发
    系统建模的起点,指导所有的类图和交互图的设计
    产生测试用例,用户文档
    估计项目大小和进度
    

    2. 状态图

    (1). 定义

    状态机图是对单个类的对象的生命周期进行建模,描述了对象时间上的动态行为,每个对象被认为是事件驱动的孤立实体

    事件表达对象间的调用、显式信号、值的改变或时间的推移

    调用事件、变更事件、信号事件、时间事件
    

    状态描述对象生命周期的一段时间,可以是等待其它事件时所处的时间,或是执行某一活动时所处的时间,状态分为简单状态和复合状态

    状态图用于揭示Actor、类、子系统和组件的复杂特性。 为实时系统建模。

    (2). 状态图的组成

    状态

    对象的状态是指在这个对象的生命期中的一个条件或状况,在此期间对象将
    满足某些条件、执行某些活动,或等待某些事件。
    

    转移

    转移是由一种状态到另一种状态的迁移。这种转移由被建模实体内部或外部事件触发。
    对一个类来说,转移通常是调用了一个可以引起状态发生重要变化的操作的结果。
    

    在这里插入图片描述

    3. 活动图

    (1). 定义

    活动图是用状态机对工作流进行建模的特殊形式,它和流程图很类似,不过它支持并发控制

    活动图一般不描述所有的运算细节,它显示活动的流,但不显示执行活动的对象

    活动图处于系统的外部和内部视图之间,所以它可以作为设计的起点,为了完成设计,每个活动必须扩展成一个和多个操作,每个操作被指派给特定的对象来实现

    带有生命线的活动图和无生命线的活动图

    在这里插入图片描述
    在这里插入图片描述

    4. 序列图

    (1). 定义

    • 对象行为是通过交互来实现的,交互是对象间为完成某一目的而进行的一系列消息交换

    • 消息是对象间的单向通信,从发送者到接受者的携带信息的控制流消息可能带有值参

    • 消息序列可用两种图表示:序列图(重点在消息的时间顺序)和协作图(重点在交换消息的对象间的关系)对协作图来说,时间顺序可以从顺序号获得

    5. 协作图

    (1). 定义

    协作图包含分类角色和关联角色,当它实例化时,对象被绑定到分类角色,链被绑定到关联角色。
    协作图对实现协作的对象和链进行建模,而忽略其他对象

    协作图是一种交互图,强调的是发送和接收消息的对象之间的组织结构,使用协作图来说明系统的动态情况。

    协作图主要描述协作对象间的交互和链接,显示对象、对象间的链接以及对象间如何发送消息。

    协作图可以表示类操作的实现。

    (2). 协作图与时序图转换

    打开时序图,Ctrl+A选中图中的所有的元素,然后菜单上找到DESIGNE | Model Transformation (MDA) | Transform Selected Elements,在弹出的界面中右边的Transformations 中选Communication, 再点击 Do Transform 即可。

    三. UML机制

    1. 注释

    注释用于解释设计的思路,便于理解
    一个好的模型应该有详尽的注释

    2. 规范说明

    • 软件模型必须是完整的,以便于软件系统的建造。此模型必须具备足够的详细信息以供软件建造使用。

    • 构成完整模型的详细信息就是模型的规范说明(简称规范)

    • 规范说明的内容一般用属性名和属性值的形式来表达。UML中有许多预定义的属性

        如:文档(documentation)、持续性(persistence)和并发性(Concurrency)等
      
    • 属性一般作为模型成分附加说明

        比如,用一些文字逐条列举类的功能,这种规范说明方式是非形式化的
      

    3. 修饰

    修饰描述UML模型成分最主要的特征

    UML模型中类:

    “-”表示私有的(Private),
    “+”表示公开的(Public),其他类可访问,
    “#” 表示受保护的(Protected)
    

    4. 扩充机制

    UML扩充机制(extensibility mechanisms):

    版型(stereotype)、标记值(tagged value)和约束(constraint) 
    

    5. 公共划分

    四. UML建模

    1. UML建模流程

    UML是一种建模语言而不是方法,这是因为UML中没有过程的概念,而过程正是方法的一个重要组成部分UML本身独立于过程,这意味着用户在使用UML进行建模时,可以选用任何适合的过程

    在这里插入图片描述

    2. 建模步骤举例

    基于UML的系统开发采取增量迭代开发模型

    在这里插入图片描述

    1. 需求

      最初需求规格说明应当由代表系统最终用户的人员提供,内容包括系统基本功能需求和对计算机系统的要求

    2. 分析

      分析的任务是找出系统的所有需求并加以描述,同时建立模型,以定义系统中的关键领域类,应由系统用户和开发人员合作完成

      分析的第一步是定义用例,以描述所开发系统的外部功能需求用例分析包括阅读和分析需求说明,此时需要与系统的潜在用户进行讨论

    3. 设计

      设计阶段的任务是通过综合考虑所有的技术限制,以扩展和细化分析阶段的模型

      设计阶段可以分为两个部分:

       1. 结构设计:是高层设计,其任务是定义包(子系统),
       包括包间的依赖性和主要通信机制我们希望得到尽可能简单和清晰的结构,
       各部分之间的依赖尽可能的少,并尽可能的减少双向的依赖关系 
       
       2. 详细设计:细化包的内容,使编程人员得到所有类的一个足够清晰的描述
      
    4. 实现

      构造或实现阶段是对类进行编程的过程可以选择某种面向对象对象编程语言(如Java)作为实现系统的软件环境Java很容易实现从逻辑视图到代码部件的映射,因为类到Java代码文件之间是一一映射关系

       在实现阶段中,可以选取各种图的说明来辅助编程,比如:类图,状态图和动态图等
      
    5. 测试和配置

      完成系统编码后,需要对系统进行测试,它通常包括:单元测试、集成测试、系统测试和验收测试

    五. 建模工具

    六. UML与软件工程对应关系

    如果把软件开发比作学校建一座高楼,那么软件工程就是指导我们怎么盖,不至于在构建一座大楼的时候,最后不知不觉变成四不像。而UML图正是对大楼主体架构的设计。软件工程是软件开发设计的灵魂,是我们前进的思想性指导。它使我们的设计有法可依,有章可循。比如我们学校现在盖的大楼,必须要有蓝图来规划哪块哪块盖什么楼,什么类别的都是前期需要用例建模来具体协商的。

    具体步骤:
    1.前期的需求分析描述需要用例图,用例图的使用者是学校,了解这栋大楼的主体结构,功能是什么,教学楼还是宿舍。学校最关心的是楼质量问题和安全性,是否能够满足学生的基本使用。

    2.进一步需要设计楼内部的具体结构,此时就需要类图,对象图,组件图和部署图来制定标准化的结构,详细的描述内部需求和具体设施的安排,为具体施工指明工作点。

    3.接下来就需要安排具体的人员开工,活动图安排各个工种在自己的岗位工作;状态图安排施工设备的使用情况,表明设备的忙碌和空闲状态;而具体施工步骤需要工程安排每一块的开始,不能先上后下,从基地开始。

    此外还需要各个施工队的协作,连接性是这个工程的最后标志,各个团队之间必须密切协作才能完成整体的。

    在这里插入图片描述

    1、需求分析

    用例图用来建模客户的需求。角色以及系统功能建模是用例建模来画的。它们之间的关系建模被用于角色和用例。每个用例都代表了客户的需求。需求分析不仅适用于软件系统进行而且适用于建筑工程行业。

    2、系统分析

    此阶段是寻找问题 -就是找刺的,需要考虑系统可能遇到的问题是主要的工作。借助于逻辑视图和动态视图实现。系统的静态由类图来建模,系统的动态则是协作图、序列图、活动图和状态图建模。只是列出系列的问题和稍微一点解决思路,不作出详细的解决方案。只是大方向上的做出引导,提纲,具体细节需要下一阶段结合实际分析。

    3、系统设计

    将分析阶段列出的问题进行汇总,根据提纲作出具体、细节办法。进而把分析结果扩展为技术层次的解决依据,不在停留在文字方面,需要依靠用户接口提供技术基础结构。数据库在这个技术基础结构中,分析阶段的领域问题类被嵌入在其中。构造阶段的详细的规格说明是设计阶段的结果。

    4、系统实现(构造)

    把设计阶段的类转换成某种面向对象程序设计语言的代码。只能在构造阶段实现代码的转变,其他阶段不能!在对UML表述的分析和设计模型进行转换时,最好不要直接把模型转化成代码。在早期阶段,模型是理解系统并对系统进行结构化的手段。

    5、系统测试

    根据测试的先后顺序排序:单元测试、集成测试、系统测试和接受测试。不同的测试采用不同的UML图作为工作的基础。类图和类的规格说明是单元测试;组件图和协作图的是集成测试;系统测试实现用例图来确认系统的行为符合这些图中的定义。
    在系统测试阶段,UML模型还可以作为测试阶段的依据。如单元测试使用类图和类规格说明;集成测试使用组件图和协作图;系统测试用例图来验证系统的行为;验收测试由用户进行,以验证系统测试的结果是否满足在分析阶段确定的需求。

    展开全文
  • ATM系统对象模型建模

    千次阅读 2018-10-27 23:47:30
    实验2 对象模型建模 一、实验目的 1.熟悉对象模型建模方法; 2.掌握使用StarUML绘制类图的方法; 3.掌握类的描述方法。 二、实验内容 按照以下ATM系统的描述,对其进行对象模型建模。 ATM系统是一个复杂的软件控制...
  • AE的对象模型图OMD。
  • 对象模型图(OMD)

    千次阅读 2016-01-25 15:26:25
    原文地址:对象模型图(OMD)作者:安睡OMD是基于OMT(Object Modeling Technique)的表示方法,先来看看OMD能帮我们做些什么?  1.该类支持哪些接口;  2.完成任务需要哪些对象;  3.如何使用该类的对象;  ...
  • UML概述及UML模型图的构成和关系

    千次阅读 2016-08-07 23:09:07
     UML(Unified Modeling Language)为面向对象软件设计提供统一的、标准的、可视化的建模语言。适用于描述以用例为驱动,以体系结构为中心的软件设计的全过程。   UML的定义包括UML语义和UML表示法两个部分。 ...
  • 文章目录一:概念(1)定义(2)工具二:类图的基本符号(1)定义类A:表示B:命名规则(2)定义属性(3)定义服务三:表示关系的符号(1)关联A:定义B:...对象模型表示静态的、结构化的系统的数据性质。它是对模拟客
  • 数据模型是指数据库的组织形式,它决定了数据库中数据之间联系的表达方式,即把在计算机中表示客观事物及其联系的数据及结构称为数据模型。...2、面向对象模型 3、时态GIS模型 4、三维数据模型 二、传统数据模...
  • 类图和对象图详解

    万次阅读 多人点赞 2016-11-03 12:34:13
    对于类图和对象图来说我们需要了解的是类图和对象图的概念,类图的组成,使用Rose创建类图和对象图。当然最重要的是如何使用Rose创建类图案例分析。具体的创建通过选课管理系统的简单用例说明创建类图和对象图的方法...
  • 业务模型;UML类图
  • UML模型中的-静态【类图、对象图

    千次阅读 热门讨论 2019-01-22 11:15:56
     对象图也是静态中的一种,它显示的是对象对象之间的关系对象图是类图中的某一具体对象的实例,它描述一个系统在某个具体时刻的静态结构,而类图描述所有可能的情况。对象图使用的元素符号与类图相似。 ...
  • 建立对象模型即使用UML画类图

    万次阅读 多人点赞 2017-06-04 12:37:01
    UML类图画法及其之间的几种关系 最近复习软件工程的考试,大...看见建立对象模型的题目首先想到就是使用UML画类图,有一定的步骤 文章目录如下: 类图画法 类之间的几种关系:泛化(Generalization)、实现(Reali
  • Kubernetes对象模型

    万次阅读 2018-10-13 20:44:20
    Kubernetes对象 在之前的文章已经讲到了很多Kubernets对象,包括pod,service,deployment等等。Kubernets对象是一种持久化,表示集群状态的实体。它是一种声明式的意图的记录,一般使用yaml...在Kubernetes对象模型...
  • 浅析ER模型关系模型

    万次阅读 热门讨论 2018-03-28 10:31:16
     ER模型关系模型的区别以及转换是“数据库系统原理”中常考的考点,今天就带领大家梳理一下知识点,并以形象的形式理解!----------------------------------------------------------------ER...
  • 关系数据库模型设计

    千次阅读 2020-05-19 17:13:17
    本文从现实世界-概念世界(信息世界)-机器世界(数据世界)逐级抽象,旨在以浅显易懂的语言描述关系数据库应该如何建模,最后用简单名了的描述给出关系模型的设计范式的含义。
  • 层次数据模型     定义:层次数据模型是用树状<层次>结构来组织数据的数据模型。     满足下面两个条件的基本层次联系的集合为层次模型     1. 有且只有一个结点没有双亲结点,这个结点称为根结点...
  • 关系数据库与对象数据库

    千次阅读 2019-08-12 16:01:38
    关系数据库(英语:Relational database),是创建在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。关系模型是由...
  • SWMM对象模型

    千次阅读 2018-09-26 14:46:08
    1-1 典型的城市排水系统(来自EPA) 上描绘了典型的城市排水系统所包含的要素。SWMM将该系统进行概化为几个主要环境体之间的一系列水流和物质流。这些环境体包括如下: 大气环境体产生降水并将污染物沉积到...
  • 案例讲解如何将ER转化为关系模型

    万次阅读 多人点赞 2021-03-29 15:31:38
    要将ER转化为关系模型,就得先弄清楚ER中的基本元素。 如果不清楚主体、属性、键等元素分别代表什么,那么下面谈转化准则的时候,大家可能会冒出很多问号。 关于ER的基本元素,此前在这篇文章中做过详细介绍...
  • 数据模型(Data Model)是数据特征的抽象,它从抽象层次上描述了系统的静态特征、动态行为和约束条件, ...常见的数据模型有层次模型、网状模型关系模型三种。 关系其实就是一个二维表的意思,行列对应,..
  • 面向对象模型的介绍

    千次阅读 2019-06-05 09:17:20
    面向对象模型 什么是面向对象呢?就是描述业务和操作员之间的关系,就是这个模块是谁操作的,就是权限。 一、所谓的面向对象模型,其实就是你要分析所做的系统,有多少个操作人员,就比如以下截图中的这个系统: ...
  • OMT 对象模型、动态模型和功能模型

    千次阅读 2015-09-09 17:01:01
    对象模型描述系统中对象的静态结构、对象之间的关系、对象的属性、对象的操作。对象模型表示静态的、结构上的、系统的“数据"特征。对象模型为动态模型和功能模型提供了基本的框架,对象模型用包含对象和类的对象...
  • 父类、子类、超类B:单继承多继承C:继承的优点(9)多态性(10)重载三:面向对象建模四:对象模型五:动态模型六:功能模型 一:面向对象方法学概述 (1)定义 按人类习惯的思维方法,以现实世界中客观存在的对象...
  • 数据库实体联系模型关系模型

    千次阅读 2020-03-02 19:11:33
    数据库设计是指根据用户的需求,在某一具体...这就需要规划课程、学生、老师、学习资料等数据构成以及相互之间的关系。因此,规划数据构成及数据间关系,并应用某一具体的数据库管理系统如MySQL构建数据库的过程就是...
  • 概念模型关系模型关系规范化

    万次阅读 多人点赞 2017-05-20 16:18:34
    》概念模型  概念模型用于信息世界的建模,是实现现实世界到信息世界的第一层抽象,是数据库设计人员进行数据库设计的有力工具,也是数据库设计人员和用户之间进行交流的语言,因此概念模型一方面具有较强的语义...
  • 实体-关系图转换为关系模型

    万次阅读 多人点赞 2019-04-25 16:54:19
      由于目前使用的数据库基本上都是关系数据库,因此首先需要将E-R转换为关系模型,然后根据具体DBMS的特点和限制转换为特定的DBMS支持下的数据模型,最后进行优化。 2.E-R关系模型的转换 2....
  • 数据库领域中主要的逻辑数据模型有:层次模型、网状模型关系模型、面向对象数据模型等,我们重点讲解了**层次模型、网状模型关系模型**。 1.1 层次模型 层次数据库系统的典型代表是IBM公司的Information ...
  • 一、层次数据模型  定义:层次数据模型是用树状<层次>结构来组织数据的数据模型。  其实层次数据模型就是的图形表示就是一个倒立生长的树,由基本数据结构中的树(或者二叉树)的定义可知,每棵树都有且仅有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 410,447
精华内容 164,178
热门标签
关键字:

对象模型图关系