一、设计模式 - UML (统一建模语言) - 类图


文章目录

  • 前言
  • UML 类图
    • 1. 类图的自身结构
    • 2. 关联关系
      • 2.1. 自关联
      • 2.2. 单向关联
      • 2.3. 双向关联
    • 3. 聚合关系
    • 4. 组合关系
    • 5. 依赖关系
    • 6. 继承关系
    • 7. 实现关系

前言


统一建模语言(Unified Modeling Language,UML)是用来设计软件的可视化建模语言,它统一规范了各种图形的
含义,设计者按照 UML 规范去画图,看图者就能迅速掌握设计者的思路

UML 以不同的角度,将图形归类为,用例图、类图、对象图、状态图、活动图、顺序图、协作图、构件图、部署
图、包图、组合结构图、交互概览图共 13 种图形,学习设计模式主要用到的是类图,所以本文会记录类图的用法


UML 类图


类图是一种静态的结构图,它能描述类或接口自身的结构(类名,类的属性,类的方法),也能描述类与类之间的
关系(关联关系、聚合关系、组合关系、依赖关系、继承关系、实现关系)

关联关系、聚合关系、组合关系,这三个是非常容易混淆的概念,因为这三个关系都是以类成员属性的方式实现,
实现它们的语法是相同的,只能从概念进行区分,后面会详细介绍每个关系的特点,注意总结它们的区别


1. 类图的自身结构


类图自身的结构由三部分组成(名称区域、属性区域、方法区域 )(下面 中括号 里的内容属于可选项):

  1. 名称区域: 类名或接口名,接口时,要分为两行,第一行写 <<Interface>>,在第二行写接口名
  2. 属性区域: 成员访问级别 属性名称 : 属性类型 [ = 属性缺省默认值 ]
  3. 方法区域: 成员访问级别 方法名称(参数列表) [ : 方法返回类型 ]

成员访问级别分为:

  • 公共 (public):+
  • 私有 (private):-
  • 父子类或相同包下 (protected):#

1. 示例:类图的自身结构
类的完整表示方式
通过上图我们可以得到信息:

  1. 这是一个名字为 Person 的类
  2. 包含一个成员属性 name,该属性的访问级别为公共、属性的类型是 String、 属性的默认值是 “ares5k”
  3. 包含一个成员属性 age,该属性的访问级别为私有、属性的类型是 int
  4. 包含一个成员方法 setName,该方法的访问级别为公共、方法需要一个 String 类型的参数
  5. 包含一个成员方法 getName,该方法的访问级别为公共、方法的返回值是 String 类型

2. 示例:接口的完整表示方式
接口的完整表示方式
接口和类的结构同理,我们可以得到如下信息:

  1. 这是一个名字为 Runnable 的接口
  2. 包含一个方法 run,该方法的访问级别为公共、方法的返回值是 String 类型

2. 关联关系


关联关系又分为自关联、单向关联,双向关联,实际代码中,这种关系通过成员属性的方式实现

关联关系的特点:这种包含关系更强调两个类是使用关系,而非整体与部分的关系,比如人和车,从事物本身来
讲,车不属于人的一部分,人只是单纯要使用车


2.1. 自关联


表示自关联关系需要满足两点:

  1. 拥有一个带有实心三角箭头的实线
  2. 该实线的箭头和线尾部都指向自身

自关联
上图是一个自关联关系,容器是一个单独的物体,从事物本身来讲,另一个容器 subContainer 并不应该是它的一部
分, 容器中包含另一个容器 subContainer 单纯是为了使用


用 Java 代码实现上图关系:

/*** 容器类*/
class Container {/*** 容器中要使用其他容器*/public Container subContainer;
}

2.2. 单向关联


表示单向关联关系需要满足三点:

  1. 拥有一个带有实心三角箭头的实线
  2. 该实线的箭头指向其关联的另一个类图
  3. 该实线的线尾部指向自身

单向关联
上图是一个单向关联关系,从事物本身来讲,车不属于人的一部分,人只是单纯要使用车

用 Java 代码实现上图关系:

/*** 汽车类*/
class Car {
}/*** 人类*/
class Person {/*** 人要使用小汽车*/public Car car;
}

2.3. 双向关联


表示双向关联关系需要满足两点:

  1. 拥有一个没有箭头的实线
  2. 该实线连接两个相互关联的类图

双向关联
上图是一个双向关联关系,从事物本身来讲,鱼不属于猫的一部分,猫也不属于鱼的一部分,它们两个关联,
完全是吃与被吃的关系


用 Java 代码实现上图关系:

/*** 猫类*/
class Cat {/*** 猫要吃鱼*/public Fish fish;
}/*** 鱼类*/
class Fish {/*** 鱼想知道被哪个猫吃了*/public Cat cat;
}

3. 聚合关系


聚合关系通过成员属性的方式实现,它的特点:从事物本身的角度看,成员类可以单独存在,而主类必须依赖成员
类,比如,商品可以单独存在,而订单必须包含商品,否则就没有意义

表示聚合关系需要满足三点:

  1. 拥有一个带有空心菱形箭头的实线
  2. 该实线的箭头指向自身
  3. 该实线的尾部指向其需要聚合的另一个类图

聚合
上图是一个聚合关系,它展示了订单必须聚合商品

用 Java 代码实现上图关系:

/*** 商品类 - 该类可以单独存在*/
class Goods {/*** 商品名称*/public String goodsName;
}/*** 订单类*/
class Order {/*** 订单需要包含商品,否则订单就没意义*/public List<Goods> goodsList;
}

4. 组合关系


组合关系通过成员属性的方式实现,它的特点:从事物关系的角度讲,主类必须依赖成员类,而成员类也不能单独
存在,它单独存在没有意义,必须被包含在主类中,比如,嘴巴单独存在就没有意义,它必须包含在头中

表示组合关系需要满足三点:

  1. 拥有一个带有实心菱形箭头的实线
  2. 该实线的箭头指向自身
  3. 该实线的尾部指向其需要组合的另一个类图

组合
上图是一个组合关系,发动机单独存在没有意义,必须包含在汽车内才可以

用 Java 代码实现上图关系:

/*** 发动机类 - 该类不能单独存在,因为发动机如果不在汽车中就没有意义*/
class Engine {/*** 发动机马力*/public int power;
}/*** 汽车类*/
class Car {/*** 需要引擎才能组合成一个汽车*/public Engine engine;
}

5. 依赖关系


依赖关系会被定义在方法参数或局部变量中,它的特点:偶然参与性,从事物本身来讲,被依赖的类并不属于主
类的一部分,但是在主类的某些行为中,可能会需要其参与,比如,车子并不是人的一部分,但人有很多行为,当
中开车的行为就需要车子的参与

表示依赖关系需要满足三点:

  1. 拥有一个带有三角箭头的的虚线
  2. 该虚线的箭头指向其依赖的另一个类图
  3. 该虚线的线尾部指向自身

依赖关系
上图是一个依赖关系,车子并不是人的一部分,但人有很多行为,当中开车的行为就需要车子的参与

用 Java 代码实现上图关系:

/*** 汽车类*/
class Car {
}/*** 人类*/
class Person {/*** 驾驶** @param car 人要驾驶汽车*/public void drive(Car car) {}/*** 走路*/public void walk() {}/*** 说话*/public void talk() {}
}

6. 继承关系


继承关系是指父子类,通过开发语言的关键字实现,比如 Java 中使用 extends 来实现继承关系,继承属于耦合度
很高的关联,子类会继承父类的所有非私有的属性和方法

表示继承关系需要满足三点:

  1. 拥有一个带有空心三角箭头的的实线
  2. 该实线的线尾部指向子类
  3. 该实线的箭头指向父类
  4. 子类从父类中继承的属性和方法,不需要列举在子类的类图中

继承
上图是一个继承关系,父类 Person 中定义了公共的成员属性 name, Teacher 和 Student 的类图中虽然没有定义
name 属性,但是因为它们都继承于 Person,所以它们也都默认拥有 name 属性


用 Java 代码实现上图关系:

/*** 人类*/
class Person {/*** 名字*/public String name;
}/*** 教师类*/
class Teacher extends Person {/*** 教师编号*/public String teacherNo;
}/*** 学生类*/
class Student extends Person {/*** 学生编号*/public String studentNo;
}

7. 实现关系


实现关系是指接口和实现类,是通过开发语言的关键字完成,比如 Java 中使用 implements 来完成接口和实现类
关系,接口中定义的方法和属性,其实现类会默认拥有,如果接口中的方法没有默认方法体,则实现类必须将方法体完成

表示实现关系需要满足三点:

  1. 拥有一个带有空心三角箭头的的虚线
  2. 该虚线的线尾部指向实现类
  3. 该虚线的箭头指向接口

实现
上图是一个实现关系,Person 和 Dog 实现了 Action 接口,那么 Person 和 Dog 就都默认拥有 run 方法,如果
接口 Action 中的 run 方法没有定义默认方法体,那么 Person 和 Dog 就必须完成 run 方法


用 Java 代码实现上图关系:

/*** 动作类*/
interface Action {/*** 跑 - 没有定义默认方法体*/public void run();
}/*** 人类 - 要实现动作接口*/
class Person implements Action {/*** 跑-完成方法体*/public void run() {}
}/*** 狗类 - 要实现动作接口*/
class Dog implements Action {/*** 跑-完成方法体*/public void run() {}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/26551.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redux在react中的应用,使用antdDesign完成购物车

目录 一.redux的认识 二.什么时候使用redux 三.安装redux 四.redux的使用 1.创建store 2.创建reducer 3.创建action 4.在页面中引入store (1)在商品列表页引入store (2)在购物车页面引入store 五.运行效果图 一.redux的认识 redux 和react没有什么直接的关系&#x…

小黑跟老黑们夜骑车拍完了毕业照面试了两场的leetcode之旅:793. 阶乘函数后 K 个零

小黑代码 class Solution:def preimageSizeFZF(self, k: int) -> int:# 获取n的阶乘的0个数lru_cachedef get_zero(n):if not n:return 0return (n//5) get_zero(n//5)# 二分查找def bin_search(k):# 定义左右指针left 0right int(1e10)while left < right:mid (lef…

python基础 | Pandas基础

文章目录 &#x1f4da;基本数据结构&#x1f407;Series&#xff1a;存储一维&#x1f407;DataFrame:存储二维&#x1f407;Series和DataFrame的关系 &#x1f4da;常用基本函数&#x1f407;数据基本操作&#x1f955;列的查改增删&#x1f440;查看列&#x1f440;修改列&a…

Python面向对象二(第十二讲)

文章目录 知识点1.私有属性与私有方法1.私有属性2.私有方法 2.成员3.实例属性1.类属性(静态属性)2.属性总结 4.实例方法5.类方法6.静态方法7.封装介绍8.继承(重点)9.新式类与经典类练习 10.单继承1.super()练习 11.作业 知识点 私有属性与私有方法成员属性方法封装继承多态 1…

常用设计模式系列(十)—装饰者模式

第一节 前言 各位好&#xff0c;首先我要先恭喜下自己粉丝即将破百&#xff0c;也谢谢各位的捧场&#xff0c;不过也跟我自己的努力密不可分&#xff0c;我也要继续加油&#xff0c;输出更好的文章来回报大家&#xff0c;也希望大家多提建议&#xff0c;有问题我也会及时改进。…

摆摊计划1(万一以后找不到工作)

货源&#xff1a;阿里巴巴正规平台 卖炸串 硬件&#xff1a; 多功能烤肠机 购买链接&#xff1a;脆皮烤肠机燃煤气商用油炸锅商用摆摊热狗机肠机关东煮组合机批发 (1688.com) 成本&#xff1a;379.6元 食材&#xff1a; 淀粉肠&#xff08;100支试水&#xff09;&#xff…

TCP/IP协议

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录 TCP/IP协议应用层协议自定义应用层协议DNS 传输层协议端口号UDP协议UDP协议端格式 TCP协议TCP协议段格式TCP工作机制确认应答…

基于HTML+CSS+JavaScript制作美食文化网站 ——卡通创意的烧烤(5个页面) html静态网页设计制作 dw静态网页成品模板素材网页 web前端网页设计与制作 div静态网页设计

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

c语言-喝饮料问题

/* 喝饮料问题&#xff1a; 1瓶饮料1元&#xff0c;2个空瓶可以换一瓶饮料&#xff0c;给20元&#xff0c;可以喝多少饮料 */#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>int main() {int man 0, kong 0, sum 0;man 20; //一开始可以买的饮料数sum 0; /…

如何完美吃下二叉树?——二叉树练习题

文章目录 开胃前菜 基础概念选择题主菜 二叉树oj题1.单值二叉树题目思路1代码思路2代码递归展开图 2. 检查两颗树是否相同题目代码 3. 对称二叉树题目思路代码 4. 二叉树的前序遍历题目代码 5. 另一颗树的子树思路代码 6.二叉树遍历题目代码 7.二叉树的层序遍历准备环节代码实现…

动物园游记

这是学习笔记的第 1887 篇文章 今天本来打算去科技馆&#xff0c;结果发现就今天闭馆&#xff0c;真是不巧&#xff0c;于是改换了方向去了北京动物园。 早两年说动物园&#xff0c;基本都和服装批发能联系起来&#xff0c;我是纯粹的去看动物的。确切的说是陪孩子去看动物的。…

【Java核心技术卷】I/O详析

文章目录 概述Java io基本概念关于流流的分类 Java io框架一、以字节为单位的输出流的框架图&#xff08;1&#xff09;框架图图示&#xff08;2&#xff09;OutputStream详解&#xff08;3&#xff09;OutputStream子类&#xff08;4&#xff09;引申&#xff1a;打印流 二、以…

深圳-上海-呼伦贝尔-漠河-哈尔滨环行手记

C语言的精髓是指针&#xff0c;这是手艺人的小幸运&#xff0c;但这是程序员的悲哀。 今年&#xff08;2018年春节前&#xff09;的假期比较特殊&#xff0c;我这一出去就是20多天&#xff0c;请了十来天的年假…1月27号就出发离开深圳了&#xff0c;考虑到1月25号和1月26号两天…

魔幻的2020,对我来说却是逐渐觉醒的一年

2020年的最后一天&#xff0c;按照惯例总结一下成果&#xff0c;同时也制定一下来年的目标&#xff0c;每年不总得给自己立几个flag。 关于公众号 先说公众号&#xff0c;其实开通了很多年&#xff0c;直到今天&#xff0c;还差一百多粉丝才突破一万&#xff0c;这样的成绩算…

美团 大规模商品知识图谱的构建与应用

作者 | 曹雪智博士 美团 技术专家 来源 | DataFunTalk 在互联网新零售的大背景下&#xff0c;商品知识图谱作为新零售行业数字化的基石&#xff0c;提供了对于商品相关内容的立体化、智能化、常识化的理解&#xff0c;对上层业务的落地起到了至关重要的作用。 相比于美团大脑中…

连投两笔,低温预制烤肠为何成为小红书的“心头爱”?

近年来&#xff0c;随着人们生活水平的不断提高和生活节奏的加快&#xff0c;消费者的食品消费观念已经从最初的满足于温饱发展成为追求高品质的消费&#xff0c;对食品健康、质量和用餐效率等提出新要求&#xff0c;低温预制食品的需求不断提升。 根据 Frost & Sullivan&…

基于JAVA的网上水果生鲜超市商城SSM【数据库设计、论文、源码、开题报告】

叿狆号:“IT软件学习社” 主要使用技术 springspringmvcmybatisjspmysqltomcat 功能介绍 &#xff08;1&#xff09;登录注册功能&#xff1a;用户打开系统&#xff0c;浏览挑选生鲜&#xff0c;在购买生鲜之前&#xff0c;要进行注册登录&#xff0c;保证一人一个账号&…

路边2元一根的烤肠,里面究竟是什么肉?

放学之后&#xff0c;下班之余&#xff0c;大家有没有被路边滩上红彤彤、2元一根的烤肠&#xff08;热狗&#xff09;所吸引&#xff1f;那个扑鼻香味&#xff0c;能让你瞬间流口水有没有&#xff1f; 可是&#xff0c;单纯的你有没有想过&#xff0c;这些看上去就很美味的烤肠…

泰酷辣!有人把 81 个国内大模型汇总在一张图里!

在科技的世界里&#xff0c;一场革命正在悄然进行。这场革命的主角&#xff0c;就是我们今天要讲的“大模型”。这些大模型&#xff0c;就像一群巨人&#xff0c;正在各个领域中挥舞着他们的力量&#xff0c;引领着一场前所未有的技术变革。 在国内&#xff0c;这场大模型的研发…

Python 吞噬世界,GPT 吞噬 Python!ChatGPT 上线最强应用:分析数据、生成代码都精通

当地 7 月 7 日&#xff0c;OpenAI 在社交平台表示&#xff0c;将向所有 ChatGPT Plus 用户开放代码解析器&#xff08;Code Interpreter&#xff09;功能。消息一出便瞬间引发了开发者们的广泛关注&#xff0c;该功能被有的开发者认为是自 OpenAI 发布 GPT-4 以来最强大的功能…