设计模式01-类图及设计原理(Java)

一、设计模式综述

1.设计模式基本概念

设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。

2.类图及类图之间的关系(UML)

  • 类图的画法
    image-20241007153743185

  • 类图之间的关系

关联关系:如果一个类的实例为了进行某方面的工作,必须知道另外一个类的属性与方法,则我们就说该两个类之间存在关联。通常将一个类的对象作为另一个类的属性。

  1. 一般关联关系:
image-20241007154452533

2.聚合关系:代表整体与部分的关系,二者可以独立存在。在Java中及单独的两个类,一个类的对象作为另一个类的属性,通过传参等方法在包含的类中使用。

image-20241007155050014

3.组合关系:组合关系也是一种整体与部分的关系,其中整体部分负责创建和消灭部分类的对象。二者不可分割。在Java中被包含的类只能在此类中实例化对象(new)来使用。

image-20241007155108701

依赖关系:常表现为使用关系,及一个类使用另一个类,被使用类不作为使用类的属性,只是通过传参的方式进行调用。

image-20241007155922322

泛化关系:相当于Java中的继承关系,即一个类继承另一个类。

image-20241007160327278

3.类图案例

用户通过注册界面(RegisterForm)输人个人信息,单击“注册”按钮后将输人的信息通过一个封装用户输入数据的对象(UserDTO)传递给操作数据库的数据访问类,为了提高系统的扩展性,针对不同的数据库可能需要提供不同的数据访问类,因此提供了数据访问类接口,如 IUserDAO,每一个具体数据访问类都是某一个数据访问类接口的实现类,如OracleUserDAO 就是一个专门用于访问 Oracle 数据库的数据访问类。

image-20241007162907472

二、 面向对象七大原则

在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据7条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。

1.单一职责原则

  • **概念:**一个对象应该只包含单一的职责,并且该职责应该被完全的封装在一个类
  • **原理:**类的职责是高内聚,低耦合,类的职责有数据职责和行为职责
  • 案例说明:

image-20241007165405987

image-20241007170535861

2.开闭原则

  • **概念:**一个软件实体应当对拓展开放,对修改关闭。也就是在设计一个模块时,应当使得模块在不被修改的前提下可以进行扩展,即在不修改模块的情况下改变模块的行为。

  • **原理:**对系统进行抽象化设计,可以为系统设计一个相对稳定的抽象层和接口,将不同的实现行为在抽象层中扩展。

  • 案例说明:

image-20241007171523798

image-20241007171747682

3.里氏代换原则

  • **概念:**任何基类可以出现的地方,子类一定可以出现。通俗理解:子类可以扩展父类的功能,但不能改变父类原有的功能。换句话说,子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。

  • **原理:**Java的继承原理和Java的多态原理

调用成员变量:编译看左边,运行看左边

javac编译代码的时候,会看左边的父类中有没有这个变量,如果有,编译成功,如果没有编译失败。

java运行代码的时候,实际获取的就是左边父类中成员变量的值

**调用成员方法:**编译看左边,运行看右边

编译看左边:javac编译代码的时候,会看左边的父类中有没有这个方法,如果有,编译成功,如果没有编译失败。
运行看右边: java运行代码的时候,实际上运行的是子类中的方法。

  • 案例分析:

image-20241007174412029

类RectangleDemo是我们的软件系统中的一个组件,它有一resize方法依赖基类Rectangle,resize方法是RectandleDemo类中的一个方法,用来实现宽度逐渐增长的效果。当传入正方形时会造成死循环

image-20241007174738766

在resize方法中,只可以传入长方形,而在printLengthAndWidth方法中,根据里氏替换原则可以用正方形和长方形的父类作为参数。

4.依赖倒转原则

  • **概念:**高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

  • 原理:

    尽量使用抽象类,及代码在传递参数或在组合聚合关系中尽可能使用层次高的抽象类。

    类与类之间的抽象耦合是依赖倒转原则的基础。

    里氏替换原则是依赖倒转原则的基础。

  • **依赖注入:**传递对象直接的依赖关系

​ 分类:构造注入(通过构造函数传递依赖对象),设值注入(通过 setter方法传递依赖关系),接口注入(通过实现接口的抽象方法传 递依赖关系)

  • 案例分析:

image-20241007190851850

image-20241007191041938

5.接口隔离原则

  • **概念:**客户端不应该被迫依赖于它不使用的方法;一个类对另一个类的依赖应该建立在最小的接口上。
  • **原理:**单一职责原则
  • 案例分析:

image-20241007191645953

6.合成复用原则

  • **概念:**尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。(一个新的对象里通过关联关系来使用一些已有的对象使之成为新对象的一部分)
  • **原理:**降低类与类之间的耦合度
  • 继承复用:

image-20241007192245075

  • 组合或聚合复用:

image-20241007192324773

  • 案例分析:

image-20241007192509017

上述DBUtils直接被继承,当数据库改变后,对于连接不同的数据库很难实现类的复用,因此可以使用合成复用:

image-20241007192649699

7.迪米特法则(最少朋友原则)

  • **概念:**如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。

​ 迪米特法则中的“朋友”是指:当前对象本身、当前对象的成员对象、 当前对象所创建的对象、当前对象的方法参数等,这些对象同当前对 象存在关联、聚合或组合关系,可以直接访问这些对象的方法。

  • **原理:**对信息进行隐蔽,降低耦合,主要用于控制信息过载

image-20241007193338218

  • 案例说明:

image-20241007194155626

由于此系统的依赖关系复杂,很难实现复用,因此引入第三者作为自己的直接朋友,通过直接朋友,最少的和其他朋友进行通信

image-20241007194204010

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

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

相关文章

Linux 系统成为隐秘“Perfctl”加密挖矿恶意软件的目标

Aqua Security 的研究人员上周透露,数以千计的 Linux 系统可能感染了极难追踪且持久的“perfctl”(或“ perfcc ”)加密挖掘恶意软件,许多其他系统仍然面临被入侵的风险。 在观察到的所有攻击中,恶意软件都被用来运行…

C++ 非STL数据结构学习——1.4 图

一般而言&#xff0c;图的实现有邻接矩阵和邻接表两种。 1. 邻接矩阵 #include <iostream> #include <vector>class Graph { private:int V; // 顶点数量std::vector<std::vector<int>> adjMatrix; // 邻接矩阵std::vector<bool> visited; // 记…

逐次逼近型ADC转换器(SAR ADC)的原理与应用

逐次逼近型ADC&#xff08;SAR ADC&#xff0c;Successive Approximation Register Analog-to-Digital Converter&#xff09;是一种广泛应用于模拟信号数字化的模数转换器。它以其高速度、低功耗以及适中的分辨率而著称&#xff0c;特别适合于各种嵌入式系统、传感器接口以及物…

下标记数(一)

第1题 0~5出现次数&#xff08;程序填空&#xff09; 统计出一串0~5数字构成的数列中&#xff0c;6种数字各自出现的次数。 输入格式 第一行1个正整数&#xff1a;N&#xff0c;范围在[1,100]。第二行N个由0~5组成的数列。 输出格式 一行6个整数&#xff0c;分别是0~5出现的…

数据结构--线性表双向链表的实现

目录 思路设计 总体思维导图 插入部分 头插法尾插法 任意位置插入 删除部分 头结点 尾节点 中间节点 只有头结点且删除的就是头结点 ​编辑 清空链表部分 遍历清空链表的所有节点 不遍历清空 各部分代码 Main部分 MyListedList部分 IndexOutOfException部分 …

深入了解卡尔曼滤波:最优状态估计的数学神器

深入了解卡尔曼滤波&#xff1a;最优状态估计的数学神器 卡尔曼滤波是一种递归的状态估计方法&#xff0c;它通过系统模型和测量值来更新状态的最优估计。我们先来了解一下卡尔曼滤波的基本原理。 1. 假设条件 卡尔曼滤波的基本假设如下&#xff1a; 线性动态模型&#xff…

【大模型理论篇】精简循环序列模型(minGRU/minLSTM)性能堪比Transformer以及对循环神经网络的回顾

1. 语言模型之精简RNN结构 近期关注到&#xff0c;Yoshua Bengio发布了一篇论文《Were RNNs All We Needed?》&#xff0c;提出简化版RNN&#xff08;minLSTM和minGRU&#xff09;。该工作的初始缘由&#xff1a;Transformer 在序列长度方面的扩展性限制重新引发了对可在训练期…

IO重定向

文章目录 IO重定向概念3个标准文件描述符“最低可用文件描述符”原则 默认的连接&#xff1a;tty使用close then open将stdin定向到文件使用open..close..dup..close将stdin定向到文件使用open..dup2..close将stdin重定向到文件课上实验 IO重定向 大多数的程序不接收输出文件名…

015 品牌关联分类

文章目录 后端CategoryBrandEntity.javaCategoryBrandController.javaCategoryBrandServiceImpl.javaCategoryServiceImpl.javaBrandServiceImpl.java删除 npm install pubsub-jsnpm install --save pubsub-js这个错误是由于在尝试安装 pubsub-js 时&#xff0c;npm 发现了项目…

计算机毕业设计 基于Python的荣誉证书管理系统的设计与实现 Python毕业设计 Python毕业设计选题 Django框架 Vue【附源码+安装调试】

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【自动驾驶】UniAD代码解析

1.参考 论文&#xff1a;https://arxiv.org/pdf/2212.10156 代码&#xff1a;https://github.com/OpenDriveLab/UniAD 2.环境配置 docs/INSTALL.md &#xff08;1&#xff09;虚拟conda环境 conda create -n uniad python3.8 -y conda activate uniad &#xff08;2&#…

哀牢山“禁区”爆改“景区”,双卫星智能终端给驴友多一份保障

在这个国庆假期&#xff0c;以神秘莫测、地势凶险著称的哀牢山走红&#xff0c;一天之内占据了多个微博热搜。但是&#xff0c;哀牢山的美丽背后隐藏着不可小觑的风险。景区方面已发出安全警示&#xff0c;提醒游客勿轻易涉足未知地带和未开发区域&#xff0c;以免发生危险。 …

论文翻译 | Dynamic Prompting: A Unified Framework for Prompt Tuning

摘要 已经证明&#xff0c;在从预训练的基础模型中高效提取知识方面&#xff0c;提示调整&#xff08;prompt tuning&#xff09;技术是非常有效的&#xff0c;这些基础模型包括预训练的语言模型&#xff08;PLMs&#xff09;、视觉预训练模型以及视觉-语言&#xff08;V-L&…

【网络协议大花园】应用层 http协议的使用小技巧,用好了都不用加班,效率翻两倍(下篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

HCIP--以太网交换安全(二)

端口安全 一、端口安全概述 1.1、端口安全概述&#xff1a;端口安全是一种网络设备防护措施&#xff0c;通过将接口学习的MAC地址设为安全地址防止非法用户通信。 1.2、端口安全原理&#xff1a; 类型 定义 特点 安全动态MAC地址 使能端口而未是能Stichy MAC功能是转换的…

[运维]6.github 本地powershell登录及设置ssh连接

当我在本地的git hub 进行修改后&#xff0c;需要推送到远程github仓库。 当我运行了git add . git commit -m "ingress-controller image" 以后&#xff0c;运行git push origin main&#xff0c;发现由于网络原因无法连接到远程github仓库。 此时开始设置ssh连…

数组与集合的应用-数组演练

1、获取一维数组最小值 1.1 实例说明 一维数组常用于保存线性数据&#xff0c;例如数据库中的单行数据就可以使用一维数组保存。本实例接收用户在文本框中输入的单行数据&#xff0c;其中数据都是整数数字&#xff0c;以不同数量的空格分割数字&#xff0c;如图1所示。这个先行…

Spring相关知识补充

目录 一、将Bean存储到spring&#xff08;容器&#xff09;中 1、使用spring-config的方式将对象存储到spring容器中 2、使用类注解的方式将Bean对象存储到容器中 1️⃣、配置扫描路径&#xff08;使用注解的方式存对象的前提&#xff09; 2️⃣、使用五大类注解存储Bean对…

C语言练习

接下来一段时间&#xff0c;博主要参加军训没有时间更新C语言知识点&#xff0c;但博主会每天更新一道C语言的题作为分享。 1.计算并显示整数的差 分析&#xff1a;1.题目并不难&#xff0c;首先我们要知道printf这个库函数&#xff0c;是用来打印数据到屏幕的库函数 2.设置变…

【AI知识点】反向传播(Backpropagation)

反向传播&#xff08;Backpropagation&#xff09; 是训练神经网络的核心算法&#xff0c;它通过反向逐层计算损失函数对每个权重的梯度&#xff0c;来反向逐层更新网络的权重&#xff0c;从而最小化损失函数。 一、反向传播的基本概念 1. 前向传播&#xff08;Forward Propag…