【设计模式】UML类图和六大设计原则

news2024/11/15 21:36:36

前言

在实践中经常看到工厂模式、观察者模式等字眼,渐觉设计模式的重要性,于是开刷设计模式。

本文讲述了UML类图以及设计模式的六大原则

参考资料:

课程视频:黑马程序员Java设计模式

一、UML类图

1. 类和接口的表示方式

在这里插入图片描述

如图所示,在 UML 类图中,第一栏为类的名称,第二栏为类的属性(field),第三栏为类的方法(method)

属性/方法之前的 - + # 表示访问权限:
- 表示 private
+ 表示 public
# 表示 protected

属性的完整表示方式是: 可见性 名称 :类型 [= 缺省值]
方法的完整表示方式是: 可见性 名称(参数列表)[:返回类型]

接口图 和 类图 的主要区别是顶端有 <<interface>>

2. 关联和双向关联

关联关系表示存在对象的引用,如 A 类中某一个成员变量的类型为 B 类,那么 A 类依赖于 B 类

在这里插入图片描述

关联关系使用 实心箭头 表示

在这里插入图片描述

双向关联使用 横线 表示

3. 组合和聚合

组合聚合 都是关联的特例,强调整体和部分的关系,在转换为关系模型时跟关联没有区别,但是在
UML 中的描述存在语义上的区别。

组合

组合 中的整体和部分具有强依赖,整体的对象负责部分的对象的生命周期,如鸟和翅膀
在这里插入图片描述

组合关系用 实心菱形+横线/实线箭头 表示

聚合

而聚合的整体和部分可以独立存在,如汽车和轮胎,部门和员工

在这里插入图片描述

聚合关系用 空心菱形+横线/实线箭头 表示

3. 依赖、继承、实现

依赖

依赖是一种使用关系,它是对象之间耦合度最弱的一种关联方式,是临时性的关联。

表示一个类中的方法通过 局部变量、方法的参数或者对静态方法 的调用来访问另一个类(被依赖类)中的某些方法来完成一些职责。
在这里插入图片描述

依赖关系用 虚线箭头 表示

继承

继承关系是对象之间耦合度最大的一种关系,表示一般与特殊的关系,是父类与子类之间的关系

在这里插入图片描述

继承关系用 空心三角实线箭头 表示

实现

实现关系是接口与实现类之间的关系。在这种关系中,类实现了接口,类中的操作实现了接口中所声明的所有的抽象操作。

在这里插入图片描述

实现关系用 空心三角虚线箭头 表示

二、六大设计原则

1. 开闭原则

开闭原则 即 对扩展开放,对修改关闭

在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。

简言之,是为了使程序的扩展性好,易于维护和升级。

实现方式是使用 接口派生类

2. 里氏代换原则

里氏代换原则 即 任何基类可以出现的地方,子类一定可以出现

通俗理解: 子类可以扩展父类的功能,但不能改变父类原有的功能

换句话说,子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法

【例子】

如果让 正方形类 继承 长方形类(包含 setLength(), setWidth()方法)

在这里插入图片描述

那么正方形类会重写长方形类的这两个方法,以实现自身的逻辑,从而违反里氏代换原则

修正方案:
在这里插入图片描述

新建 Quadrilateral 接口,让长方形和正方形分别去实现该接口,而使用长方形的类依赖该接口

3. 依赖倒转原则

依赖倒转原则 即 高层模块不应该依赖低层模块,两者都应该依赖其抽象;

抽象不应该依赖细节,细节应该依赖抽象。简单的说就是要求对抽象进行编程

不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

【例子】

电脑有多种配件比如cpu,显卡,显示器

电脑不应该依赖于特定品牌的cpu,显卡,显示器,也就是不能依赖于实现

而是应该依赖于cpu,显卡,显示器它们的抽象

4. 迪米特法则

迪米特法则 又叫最小知识法则

其含义是: 如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。

其目的是降低类之间的耦合度,提高模块的相对独立性。

迪米特法则的

【例子】

明星通过经纪人组织与粉丝的见面会

甲方公司通过乙方公司把需求拍给牛马

5. 接口隔离原则

接口隔离原则 即 客户端不应该被迫依赖于它不使用的方法; 一个类对另一个类的依赖应该建立在最小的接口上

实现上采用将 包含多个方法的接口 分解为 多个只包含少量方法的接口

【例子】

一个品牌的安全门实现了 防火、防水、防盗

另一个品牌的安全门实现了 防火、防水

若定义接口 包含 防火、防水、防盗 三个功能,那么第二个类就被迫依赖于它不使用的防盗方法

故定义三个接口分别为 防火、防水、防盗

6. 合成复用原则

合成复用原则 即 尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。

继承会将父类的细节暴露给子类,破坏了类的封装性,使子类与父类耦合度高,限制了复用的灵活性。

【例子】

现有父类为汽车,子类继承汽车,分别为汽油汽车和新能源汽车,孙子类继承汽油汽车/新能源汽车再拓展不同颜色的汽车

在这里插入图片描述

可见,再给汽车增加一种类型的动力源时,会出现很多的孙子类,扩展性很差。

修改方案:

在这里插入图片描述

父类为汽车,包含颜色属性(聚合颜色这一接口,而颜色这一接口可被各种颜色所实现),子类继承汽车使用不同的动力源

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Elasticsearch系列八】高阶使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

在线教育平台项目

介绍 基于SpringBootVue前后端分离的在线教育平台项目&#xff0c;单体应用服务架构。系统共设计三种角色&#xff1a;管理员、讲师和学员&#xff0c;三个角色分别对应一个操作端。也就是本系统1个后台项目&#xff0c;三个前端项目。管理员端没有引入角色和权限管理&#xf…

YoloV8 trick讲解

1.将 YOLOv5 的 C3结构换成了梯度流更丰富的 C2f结构: C3 C3 模块的设计灵感来自 CSPNet&#xff0c;其核心思想是将特征图的部分通道进行分割和并行处理&#xff0c;目的是减少冗余梯度信息&#xff0c;同时保持较高的网络表达能力。C3 结构与传统的残差结构类似&#xff0c;但…

【23-24年】年度总结与迎新引荐

文章目录 相关连接前言1 忙碌的备研与本科毕设2 暑期阿里之旅3 团队荣誉与迎新引荐4 项目合作意向 相关连接 个人博客&#xff1a;issey的博客 - 愿无岁月可回首 前言 自从2023年4月更新了两篇关于NLP的文章后&#xff0c;我便消失了一年半的时间。如今&#xff0c;随着学业…

软考高级:存储系统IO 数据传输方式:程序控制方式、程序中断方式、DMA 方式、通道方式、IO 处理机 AI 解读

关于计算机中的IO数据传输方式&#xff0c;有几种不同的策略可以用来进行数据的传输和控制。我们分别讲解一下它们。 生活化例子 假设你在一条生产线上工作&#xff0c;有几种方式可以处理不同的任务&#xff08;如搬运、检查、修理产品&#xff09;&#xff1a; 程序控制方…

Linux基础---09Find文件查找

百分之八十的财富掌握在百分之二十的手里&#xff0c;这就是著名的二八法则。这里列出关键字表&#xff0c;希望大家复习的时候看到关键字&#xff0c;脑袋里就自动浮现出整句命令。 查询方式主要参数文件名-name文件大小-size忽略大小写-iname按天-atime&#xff0c;-mtime,-…

目标检测基本知识

目标检测 一、目标检测二、常用的评价指标2.1 IOU2.2 NMS(非极大值抑制) 三、R-CNN网络基础3.1 Overfeat模型3.2 RCNN模型3.3FastRCNN模型 四、Faster-RCNN网络4.1 网络工作流程 五、yolo系列5.1 yoloV3 六、SSD算法 一、目标检测 目标检测的任务是找出图像中所有感兴趣的目标…

从index_put出发全面学习cuda和pytorch技术

一 前言 深感目前对于cuda和pytorch所涉及知识的广度和深度,但一时又不知道该如何去学习,经过多日的考虑,还是决定管中窥豹,从一个算子出发,抽丝剥茧,慢慢学习,把学习中碰到的问题都记录下来,希望可以坚持下去。 二 函数功能描述 【torch算子】torch.index_put和tor…

SOMEIP_ETS_112: SD_Empty_Option

测试目的&#xff1a; 验证DUT能够拒绝长度为0的IPv4选项的SubscribeEventgroup消息&#xff0c;并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议&#xff0c;当接收到一个IPv4选项长度为0的SubscribeEventgroup消息时&#xff0c;能够正…

不同编程语言如何统计代码执行时间

在软件开发过程中&#xff0c;统计代码执行时间是一个非常有用的工具&#xff0c;可以帮助开发者优化程序性能、识别瓶颈以及进行基准测试。不同的编程语言提供了不同的方法来测量代码执行时间。以下是一些常见编程语言中测量代码执行时间的方法&#xff0c;并详细解释每一步的…

I2C/IIC学习笔记

I2C/IIC 有些同学I2C和IIC分不清&#xff0c;I2C和IIC实际上是指同一种通信协议。I2C是Inter-Integrated Circuit的缩写&#xff0c;而IIC是它的另一种表述方式&#xff0c;代表的是同一个意思&#xff0c;即“集成电路间总线”。I2C是一种由飞利浦公司&#xff08;现恩智浦半…

数据结构(7.3_2)——平衡二叉树

平衡二叉树&#xff0c;简称平衡树(AVL树)----树上任一结点的左子树和右子树的高度之差不超过1. 结点的平衡因子左子树高-右子树高 //平衡二叉树结点 typedef struct AVLNode {int key;//数据域int blalance;//平衡因子struct AVLNode* lchild, * rchild; }AVLNode,*AVLTree; …

中秋:明月寄相思,灯笼映团圆

文章目录 前言项目概述实现步骤创建基础 HTML 结构添加动态背景和月亮创建 SVG 灯笼实现动态动画效果闪烁的星星效果调整灯笼和月亮尺寸 完整代码结语 前言 今天是中秋&#xff0c;这里先祝大家节日快乐&#xff01;&#x1f386;&#x1f386;&#x1f386; 在这篇博客中&…

ChatGPT有三个快捷指令和三个模式,你知道吗?

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

xtu oj 折纸

折纸# 题目描述# 一个长为a,宽为b矩形的纸&#xff0c;我们沿b边(左边)的中点与右上顶点的边折叠&#xff0c;求左上顶点在折叠以后离下边的距离&#xff1f; 输入# 第一行是一个整数T(1≤T≤10000),表示样例的个数。 以后每行一个样例&#xff0c;为两个整数1≤a,b≤1000。…

​FullCalendar:强大的JavaScript事件日历

​FullCalendar&#xff1a;强大的JavaScript事件日历 如果你想让项目的日历功能像你周末一样灵活又强大&#xff0c;那么 FullCalendar 就是你的不二选择&#xff01;本文将带你了解这款高效的 JavaScript 日历库的亮点与使用方式。 软件简介 FullCalendar 是一个用 JavaScri…

PMP--一模--解题--101-110

文章目录 11.风险管理--过程--识别风险→实施定性风险分析→实施定量风险分析→规划风险应对→实施风险应对→监督风险101、 [单选] 在项目即将进入收尾阶段时&#xff0c;项目经理发现了一项原来没有考虑到的新风险。该风险一旦发生&#xff0c;可能给最终的可交付成果带来重要…

CSS——网格布局(display: grid)之上篇

CSS——网格布局&#xff08;display: grid&#xff09; 前面介绍了弹性布局&#xff0c;今天我们介绍一下网格布局。 什么是网格布局 CSS网格布局&#xff08;CSS Grid Layout&#xff09;是一种用于创建复杂网页布局的系统&#xff0c;它允许开发者以二维系统&#xff08;…

【C++学习】 IO 流揭秘:高效数据读写的最佳实践

✨ 今朝有酒今朝醉&#xff0c;明日愁来明日愁 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3f…

Docker部署ddns-go教程(包含完整的配置过程)

本章教程教程,主要介绍如何用Docker部署ddns-go。 一、拉取容器 docker pull jeessy/ddns-go:v6.7.0二、运行容器 docker run -d \--name ddns-go \--restart unless-stopped \