Java设计模式建模语言面向对象设计原则

设计模式

设计模式的概念

设计模式最初用于建筑领域的设计中。

软件的设计模式,又称设计模式,是一套被反复使用,多数人知道的,经过分类编目的,代码设计经验的总结。

它描述了在软件设计过程中的一些不断重复发生的问题,以及如何解决这些问题。

它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。

设计模式的作用

设计模式的本质是面向对象设计原则的实际运用,是对类的封装性,继承性和多态性记忆类的关联关系和组合关系的充分理解。

正确使用设计模式具有以下优点:

  1. 可以提高程序员的思维能力,编程能力和设计能力。
  2. 使程序设计更加标准化,使软件开发效率大大提高。
  3. 使设计的代码可重用性高,可读性强,可靠性高,灵活性好,可维护性强。
  4. 能够更好的去理解源码架构。

如果需要设计大型项目架构,必须考虑增加新功能的代码变动成本,要保证新加入的功能不影响以前的功能。

在这里插入图片描述

建模语言

统一建模语言(Unifiled Modeling Language)简称UML是一种用于软件系统分析和设计的语言工具,用于帮助软件开发人员进行思考和记录思路的结果。

UML图:通过不同的图形和符号来描述软件模型以及各个元素之间的关系。

类图:展示模型的静态结构,特别是模型中存在的类,类的内部结构以及它们与其他类的关系等。

在这里插入图片描述

类是指具有相同属性,方法,关系的对象的抽象,封装了数据和行为,是OOP(面向对象程序设计)的基础,具有封装性,继承性和多态性等三大特性。

在UML中,类使用包含类名,属性和操作且带有分割线的矩形表示。

  1. 类名是一个字符串,例如:Student,Teacher
  2. 属性是指类的特性,即类的成员变量。

UML按照以下格式:

[可见性]属性名:类型[=默认值]
例如:-name:String
注意:“可见性”表示该属性对类外的元素是否可见,包括公有(Public)、私
有(Private)、受保护(Protected)和朋友(Friendly)4 种,在类图中分别
用符号+、-、#、~表示。

3.操作是类的任意一个实例对象都可以使用的行为,是类的成员方法

UML按照以下格式:

[可见性]名称(参数列表)[:返回类型]
例如:+display():void。

学生类的UML表示如下:

在这里插入图片描述

接口

接口是一种特殊的类,它具有类的结构但不可被实例化,只可以被子类实现。

它包含抽象操作,但不包含属性。它描述了类或组件对外可见的

UML表示如下:

在这里插入图片描述

类之间的关系

在软件系统中,类不是孤立的,类与类之间存在各种关系。根据类与类之间的耦合度从弱到强排列,UML中类图有以下几种关系:

依赖关系,关联关系,聚合关系,组合关系,泛化关系,实现关系。

其中泛化和实现的耦合度相等,它们是最强的。

1.依赖关系

依赖关系指的是一种临时使用的关联,是耦合度最低的关系。

某个类的方法通过局部变量,方法的参数或者对静态方法的临时调用来访问另一个类(被依赖类)中的某些方法来完成一些职责。

在UML中依赖关系使用带箭头的虚线表示,剪头从使用类指向被依赖类。

下图展示人通过手机的语言传送方法打电话

在这里插入图片描述

2.关联关系

是对象之间的引用关系。

用于表示一类对象与另一类对象之间的联系,如老师和学生,师傅和徒弟等。

关联关系是类与类之间最常用的一种关系,氛围一般关联关系,聚合关系和组合关系。

关联可以分为单向关联,双向关联,自关联。

单向关联:

在这里插入图片描述

双向关联:

在这里插入图片描述

所谓双向关联就是双方各自持有对方类型的成员变量。

自关联:

在这里插入图片描述

3.聚合关系

聚合关系是关联关系的一种,是强关联关系,是整体和部分之间的关系。

聚合关系通过成员对象实现,其中成员对象时整体对象的一部分,但成员对象可脱离整体对象独立存在。例如学校和老师的关系,若学校消失老师独立存在

聚合关系在UML图中用空心菱形的实线表示,菱形指向整体。

在这里插入图片描述

4.组合关系

组合表示类之间的整体与部分的关系,但它是一种更强烈的聚合关系。

在组合关系中,整体对象可以控制部分对象的生命周期,一旦整体对象不存在了,部分对象也将不复存在,部分对象无法脱离整体对象而存在。例如头和嘴的关系。

在UML图中组合关系使用实心菱形实线表示:

在这里插入图片描述

5.继承关系

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

在UML图中,继承关系使用空心三角剪头实线表示,剪头从子类指向父类,在代码实现时,使用面向对象的继承机制来实现继承关系。

例如下图:

在这里插入图片描述

6.实现关系

实现关系是接口和实现类之间的关系。

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

在UMl类图中,实现关系使用带空心三角剪头的虚线表示

如下图:

在这里插入图片描述

面向对象设计原则

单一职责

单一职责原则是最简单的面向对象设计原则,用于控制类的粒度大小。

对于单一职责原则,可以理解为一个类只负责一个功能领域中的相应职责,即一个类不要负责太多杂乱的工作。

在软件系统中,如果一个类继承的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或已知这个类完成其他职责的能力,这种耦合会导致一个脆弱的设计。

单一职责原则是实现高内聚,低耦合的指导方针。

以项目开发为例,如果项目组成员每个人的职责都很明确,可以专心开发自己负责的板块,那么项目成功就会相对较高,反之则较低

在这里插入图片描述

开闭原则

开闭原则指的是对拓展开放,对修改封闭。

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

为了使程序的拓展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类。

因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。

而软件中易变的细节可以中抽象派生出来的实现类来拓展。

在这里插入图片描述

依赖倒置

上层模块不应该依赖低层模块,它们都应该依赖于抽象,抽象不应该依赖于细节,细节应该依赖于抽象。

核心思想:面向接口,不面向实现编程。

抽象指的是抽象类或接口,细节指的是实现类。

使用接口或抽象类制定好规范和契约,不设计任何具体的操作,把展现细节的人物交给它们的实现类完成。

依赖倒置原则是实现开闭原则的重要途径之一,降低了类与类模块之间的耦合。

在这里插入图片描述

接口隔离

使用多个接口,而不使用单一的接口,不强迫新功能实现不同的方法。

在这里插入图片描述

组合/聚合复用原则

优先使用组合/聚合,使系统更加灵活,其次才考虑继承,达到复用的目的.

一般而言,如果两个类之间是"Has-A"关系应使用组合或聚合,如果是"Is-A"关系使用继承

里氏替换原则

使用继承时若父类的方法是非抽象的,那么子类继承父类并对父类中的非抽象方法进行重写时要注意,若使用父类的时候换成子类对象,由于子类对象重写的父类方法,从而导致有可能实现不相同导致结果不对

里氏替换原则的提出

1987年麻省理工计算机科学实验室思里科夫女士在面向对象技术的高峰会议上发表的文章《数据抽象和层次》中提出,她表明:挤成必须保证超类所拥有的性质在子类中仍然成立。

里氏替换原则主要阐述了有关挤成的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,使用继承时应该避免哪些问题。

里氏替换原则的定义

所有使用父类的地方必须能透明地使用其子类的对象。

在软件中将一个基类对象替换成它的子类对象时程序将不会产生任何错误和异常

简单来说,任何基类可以出现的地方,字类一定可以出现,所以字类可以拓展父类的中能,但不能改变父类原有的功能。

也就是说子类继承父类时,除了添加新的方法完成新增功能外,尽量不要重写父类方法,如果重写父类的方法,程序运行会发生出错概率。如果一定要用多态,那么父类可以设计成抽象接口。

历史替换原则的作用

它是功能正确性的保证。
加强程序的健壮性,提高程序的维护性降低需求变更时引入的风险

迪米特原则

只和“朋友”交谈,不和“陌生人”说话。

两个类之间如果没有直接的联系,那么就不要相互之间调用,可以通过一个第三方进行调用。

例如:明星,公司,粉丝,经纪人之间的交流

可以通过经纪人和明星,公司,粉丝分别进行接触,交流

总结

设计原则的核心思想

找出应用中可能需要变化之处,独立出来,不要和不需要变化的代码混在一起

针对抽象编程,而不是针对程序编程

为了交互对象的松耦合设计而努力

遵循设计原则;为了让程序高内聚,低耦合

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

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

相关文章

搜广推校招面经五十四

美团推荐算法 一、手撕Transformer的位置编码 1.1. 位置编码的作用 Transformer 模型没有显式的序列信息(如 RNN 的循环结构),因此需要通过位置编码(Positional Encoding)为输入序列中的每个位置添加位置信息。位置…

深入解析 SQL 事务:确保数据一致性的关键

SQL 事务 什么是 SQL 事务?事务的 ACID 特性原子性(Atomicity):示例: 一致性(Consistency):示例: 隔离性(Isolation):持久性(Durability):示例&am…

【软考-架构】11.3、设计模式-新

✨资料&文章更新✨ GitHub地址:https://github.com/tyronczt/system_architect 文章目录 项目中的应用设计模式创建型设计模式结构型设计模式行为型设计模式 💯考试真题题外话 项目中的应用 在实际项目中,我应用过多种设计模式来解决不同…

观察者模式详解:用 Qt 信号与槽机制深入理解

引言 你是否曾遇到这样的需求:一个对象的状态发生变化后,希望通知其他对象进行相应的更新?比如: 新闻订阅系统:当新闻发布后,所有订阅者都会收到通知。股票行情推送:股价变化时,所…

流量分析实践

下载附件使用wireshark打开,发现数据包非常多,一共有1万多条数据,我们点击分析来看一下协议分级 然后我们再来看一下会话,看有哪些ip地址, 我们通过会话结合大部分的流量发现,172.17.0.1一直在请求172.17.0…

新手村:混淆矩阵

新手村:混淆矩阵 一、前置条件 知识点要求学习资源分类模型基础理解分类任务(如二分类、多分类)和常见分类算法(如逻辑回归、决策树)。《Hands-On Machine Learning with Scikit-Learn》Python基础熟悉变量、循环、函…

MYSQL库的操作

目录 一、创建数据库 二、字符集和校验规则 1、查看系统默认字符集以及校验规则 2、查看系统支持的所有字符集以及字符集校验规则 3、指定字符集以及校验规则来创建数据库 4、校验规则对数据库的影响 三、操纵数据库 1、查看数据库 2、修改数据库 3、删除数据库 4、数…

Next App Router(下)

五、loading 新增 app/loading.tsx 页面 const Loading () > {return <div>Loading...</div>; }; export default Loading;修改 app/page.tsx页面 /** 假设为一个获取数字的api */ const fetch_getNumber async (): Promise<number> > {return ne…

【JAVA】】深入浅出了解cookie、session、jwt

文章目录 前言一、首先了解http的cookie是什么&#xff1f;Cookie 属性及其含义1. NameValue2. Expires3. Max-Age4. Domain5. Path6. Secure7. HttpOnly8. SameSite示例 Cookie 分类1. Session Cookies2. Persistent Cookies3. First-Party Cookies4. Third-Party Cookies 二、…

【css酷炫效果】纯CSS实现粒子旋转动画

【css酷炫效果】纯CSS实现粒子旋转动画 缘创作背景html结构css样式完整代码效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u011561335/90492008 缘 创作随缘&#xff0c;不定时更新。 创作背景 刚看到csdn出活动了&…

C++Lambda表达式

Lambda表达式 什么是Lambda表达式 ​ C11的颁布让C丰富了起来&#xff0c;任何一本介绍C11的书籍&#xff0c;都不可能跳过这一个点——Lambda表达式。人们经常称Lambda表达式是一个语法糖&#xff0c;说明这是一个”没有没事&#xff0c;有了更好“的一种语法表达&#xff0…

每天五分钟深度学习框架pytorch:基于pytorch搭建循环神经网络RNN

本文重点 我们前面介绍了循环神经网络RNN,主要分析了它的维度信息,其实它的维度信息是最重要的,一旦我们把维度弄清楚了,一起就很简单了,本文我们正式的来学习一下,如何使用pytorch搭建循环神经网络RNN。 RNN的搭建 在pytorch中我们使用nn.RNN()就可以创建出RNN神经网络…

el-table树形表格合并相同的值

el-table树形表格合并相同的值 el-table树形表格合并相同的值让Ai进行优化后的代码 el-table树形表格合并相同的值 <style lang"scss" scoped> .tableBox {/deep/ &.el-table th:first-child,/deep/ &.el-table td:first-child {padding-left: 0;} } …

2025年3月19日 十二生肖 今日运势

小运播报&#xff1a;2025年3月19日&#xff0c;星期三&#xff0c;农历二月二十 &#xff08;乙巳年己卯月丁亥日&#xff09;&#xff0c;法定工作日。 红榜生肖&#xff1a;兔、虎、羊 需要注意&#xff1a;猪、猴、蛇 喜神方位&#xff1a;正南方 财神方位&#xff1a;…

Git——分布式版本控制工具使用教程

本文主要介绍两种版本控制工具——SVN和Git的概念&#xff0c;接着会讲到Git的安装&#xff0c;Git常用的命令&#xff0c;以及怎么在Vscode中使用Git。帮助新手小白快速上手Git。 1. SVN和Git介绍 1.1 SVN 集中式版本控制工具&#xff0c;版本库是集中存放在中央服务器的&am…

QT5.15.2加载pdf为QGraphicsScene的背景

5.15.2使用pdf 必须要安装QT源码&#xff0c;可以看到编译器lib目录已经有pdf相关的lib文件&#xff0c;d是debug 1.找到源码目录&#xff1a;D:\soft\QT\5.15.2\Src\qtwebengine\include 复制这两个文件夹到编译器的包含目录中:D:\soft\QT\5.15.2\msvc2019_64\include 2.找…

【H2O2 | 软件开发】前端深拷贝的实现

目录 前言 开篇语 准备工作 正文 概述 JSON方法 递归 其他 结束语 前言 开篇语 本系列为短篇&#xff0c;每次讲述少量知识点&#xff0c;无需一次性灌输太多的新知识点。该主题文章主要是围绕前端、全栈开发相关面试常见问题撰写的&#xff0c;希望对诸位有所帮助。…

Docker - 切换源 (Linux / macOS)

文章目录 Linux 系统macOS 系统 Linux 系统 修改配置文件&#xff1a;/etc/docker/daemon.json "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn","https://hub-mirror.c.163.com"]验证是否修改成功&#xff1a; docker info重启 …

hcia复习

一、网络设备 1、交换机&#xff1a;&#xff08;1&#xff09;提供MAC地址表&#xff0c;转发数据&#xff1b; &#xff08;2&#xff09;每个接口是一个独立的冲突域&#xff1b; &#xff08;3&#xff09;凡是连在交换机上的所有设备都处于同一广播域&#xff08;网络&am…

opencv初步学习——图像处理3

这一部分我们将学习opencv中对图像大小进行调整的基本操作&#xff0c;以及掩模操作&#xff0c;我们直接进入正言 一、cv2.resize( )函数 1-1、组成与构造 该函数的作用就算用来帮助我们实现对图像大小的处理&#xff0c;具体的组成与构造如下&#xff1a; cv2.resize(src , …