当前位置: 首页 > news >正文

设计模式基础知识点(七大原则、UML类图)

Java设计模式(设计模式七大原则、UML类图)

  • 设计模式的目的
  • 设计模式七大原则
    • 单一职能原则(SingleResponsibility)
    • 接口隔离原则(InterfaceSegreation)
    • 依赖倒转原则(DependenceInversion)
    • 里氏替换原则(LiskovSubstitution)
    • 开闭原则(OpenClosed)
    • 迪米特原则(Demeter)
    • 合成复用原则(CompositeReuse)
  • UNL类图
    • 依赖关系(Dependence)
    • 泛化关系(Generalization)
    • 实现关系(Implementation)
    • 关联关系(Association)
    • 聚合关系(Aggregation)
    • 组合关系(Composition)

设计模式的目的

  • 提高代码复用性:相同的代码进行复用,不用多次编写;
  • 提高代码可读性:编程规范,并于他人阅读和理解;
  • 提高代码扩展性:设计模式遵循“对扩展开放,对修改关闭”,便于扩展;

整体来讲,程序中使用设计模式可以使代码“高内聚、低耦合”。

设计模式七大原则

设计模式原则,就是在编程时,应当遵守的原则,是设计模式的基础,也是设计模式为什么这么设计的依据。设计模式通常有7大原则:单一职责原则、接口隔离原则、依赖倒转原则、里氏替换原则、开闭原则、迪米特法则、合成复用原则。

单一职能原则(SingleResponsibility)

  • 简单的来说,就是一个类只负责一项职责
  • 注意事项:
  1. 一个类只负责一项职责,降低了类之间的耦合度,提高了类代码的可读性与可维护性,降低了进行代码变更的风险性。
  2. 通常情况下我们应当遵守单一原则,只有在逻辑足够简单的情况下可以违反单一原则(也不建议违反),只有在类方法足够少的情况下,在方法上保持单一原则。

接口隔离原则(InterfaceSegreation)

  • 接口隔离原则就是,客户端不应该依赖它不需要的接口,也就是一个类对另一个类的依赖应该建立在最小的接口上。
举例:接口A存在1-5个方法,类B实现接口A并实际重写了了1-3方法,类C实现接口A并实际重写了3-5方法,客户端类D通过接口A依赖了类BC。问题:那么对于类B和类C来说,对于接口A的依赖就没有建立在最小接口上。改进:需要将接口A拆分为A1并实际重写1-3方法,和接口A2并实际重写3-5方法,然后类B实现接口A1,类C实现接口A2.

依赖倒转原则(DependenceInversion)

  • 高层模块不应该依赖底层模块,二者都应该依赖其抽象,在Java中抽象就是指接口(Interface)和抽象类(Abstract Class)
  • 抽象不应该依赖细节,细节应该依赖抽象。
  • 依赖倒转的中心思想是面向接口编程
  • 依赖倒转原则的设计理念是:相对于细节(具体实现类)的多变性,接口和抽象类要稳定得多。以抽象为基础搭建的架构要比以细节搭建的架构稳定得多。
  • 使用接口或者抽象类的目的是制定好规范,不会涉及任何具体的操作,把展示细节交给具体实现类去完成。

里氏替换原则(LiskovSubstitution)

  • 因为继承会给程序带来侵入性,程序的可移植性低。
  • 里氏替换的核心思想是:所有引用基类的地方都必须透明地使用其子类对象,也就是在使用继承时候,在子类中尽量不要重写父类的方法。
  • 继承实际上会让两个类的耦合性增加,在适当的情况下,可以通过聚合、组合、依赖来解决

开闭原则(OpenClosed)

  • 一个软件应该对扩展开放(提供方),对修改关闭(对使用方)。用抽象构建框架,用实现扩展细节。
  • 当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改原有代码来实现变化。

迪米特原则(Demeter)

  • 一个对象应该和其它对象保持最小的了解,类与类的关系越密切,耦合度越大。
  • 迪米特法则又叫最小知道原则,即一个类对自己依赖的类知道越少越好。 也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供public方法外,不应该对外泄露任何信息。
  • 迪米特法则还有个更简单的定义: 至于直接的朋友通信。
  • 直接朋友定义:我们称为一个类中出现的成员变量、方法参数、方法返回值中的类是该类的直接朋友,其余出现在局部变量中的类不是直接朋友。
  • 迪米特最总思想就是:一个类相关的事情,就在该类中解决,而不是放在其它类中

合成复用原则(CompositeReuse)

  • 程序设计时候,尽量采取合成、聚合的方式实现, 而不是使用继承
  • 将需要变化的代码和不需要变化的代码分别独立出来,不要混淆,也就是抽取封装。
  • 针对接口编程,而不是针对具体实现编程
  • 为了减少交互对象间的轻耦合而设计。

UNL类图

依赖关系(Dependence)

  • 定义:只要在类中用到了对方,那么他们之间就存在依赖关系。
  • 在类中用到了对方指:在类的成员变量、在方法的返回类型、在方法的接受参数类型、在方法中使用到。
    在这里插入图片描述

泛化关系(Generalization)

  • 定义:泛化关系实际上就是继承关系,他就是依赖关系的特例。
    在这里插入图片描述

实现关系(Implementation)

  • 定义:实现关系实际上就是一个类实现一个接口,也是依赖关系的特例。例如:A类实现了B接口,那么我们就称A和B是实现关系
    在这里插入图片描述

关联关系(Association)

  • 定义:关联关系就是类类与类之间的联系,也是依赖关系的特例。
  • 关联关系具有导航性:即双向关系和单向关系,例如:单项一对一关系,双向一对一关系。
    在这里插入图片描述

聚合关系(Aggregation)

  • 定义: 聚合关系就是整体和部分的关系,且整体和部分可以分开的。聚合关系是关联关系的特例。
    在这里插入图片描述

组合关系(Composition)

  • 定义:组合关系是整体和部分的关系,但是整体和部分不可以分开的。
    在这里插入图片描述

相关文章:

设计模式基础知识点(七大原则、UML类图)

Java设计模式(设计模式七大原则、UML类图) 设计模式的目的设计模式七大原则单一职能原则(SingleResponsibility)接口隔离原则(InterfaceSegreation)依赖倒转原则(DependenceInversion&#xff0…...

Android开机动画的结束过程BootAnimation(基于Android10.0.0-r41)

文章目录 Android 开机动画的结束过程BootAnimation(基于Android10.0.0-r41) Android 开机动画的结束过程BootAnimation(基于Android10.0.0-r41) 路径frameworks/base/cmds/bootanimation/bootanimation_main.cpp init进程把我们的BootAnimation的二进制文件拉起来了&#xf…...

微软远程连接工具:Microsoft Remote Desktop for Mac 中文版

Microsoft Remote Desktop 是一款由微软开发的远程桌面连接软件,它允许用户从远程地点连接到远程计算机或虚拟机,并在远程计算机上使用桌面应用程序和文件。 下载地址:https://www.macz.com/mac/5458.html?idOTI2NjQ5Jl8mMjcuMTg2LjEyNi4yMz…...

【安规介绍】

文章目录 一、基础知识安规上的六类危险的防护:安全电压漏电流接触电流能量问题:火灾问题:热问题结构问题阻燃等级绝缘等级:对接地系统的要求:结构要求:电气要求: 二、设计的关键电气绝缘距离电气爬电距离:…...

[sylar]后端学习:配置环境(一)

1.介绍 基于sylar大神的C高性能后端网络框架来进行环境配置和后续学习。网站链接:sylar的Linux环境配置 2.下载 按照视频进行下载,并进行下载,并最好还要下载一个vssh的软件。可以直接在网上搜索即可。 sylar_环境配置,vssh下…...

XDMA原理及其应用和发展

XDMA原理 XDMA的主要原理是通过直接访问主机内存,实现数据的快速传输。在传统的DMA(Direct Memory Access)技术中,数据传输需要经过CPU的干预,而XDMA可以绕过CPU,直接将数据从外设读取到主机内存或者从主机…...

携程梁建章:持续投资创新与AI,开启旅游行业未来增长

5月30至31日,携程集团在上海和张家界举办Envision 2024全球合作伙伴大会,邀请超50个国家和地区的1600余名外籍旅游业嘉宾与会,共同探讨中国跨境旅游市场发展机遇,讲好中国故事。 携程国际业务增速迅猛,创新与AI解锁未…...

【网络安全的神秘世界】在win11搭建pikachu靶场

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 下载pikachu压缩包 https://github.com/zhuifengshaonianhanlu/pikachu 下载好的pikachu放在phpstudy_pro/www目录下 创建pikachu数据库 打开phpstudy软件…...

基于Java的零食管理系统的设计与实现(论文+源码)_kaic

摘 要 随着科技的进步,以及网络的普及,都为人们的生活提供了极大的方便。因此,在管理”三姆”宿舍在线零食商店时,与现代的网络联系起来是非常必要的,本次设计的系统在研发过程中应用到了Java技术,这在一定…...

【案例实操】银河麒麟桌面操作系统实例分享,V10SP1重启后网卡错乱解决方法

1.问题现象 8 个网口, 命名从 eth1 开始到 eth8。 目前在系统 grub 里面加了 net.ifnames0 biosdevname0 参数, 然后在 udev 规则中加了一条固定网卡和硬件 pci 设备号的规则文件。 最后在 rc.local 中加了两条重新安装网卡驱动的命令( rmmod…...

初级前端开发岗

定位: 日常任务的辅助执行者,前端基础建设的参与者。 素质要求: 是否遵循部门敏捷流程、规范、P0制度;具备良好的沟通和协作能力;负责日常迭代任务的落地执行;拥有较强的执行力,能够灵活解决问题; 职责&#xff1a…...

颠仆流离学二叉树2 (Java篇)

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

柏林自由大学研究团队《Ecology Letters 》揭示AMF在植物对全球变化响应的作用

全球环境变化正在影响陆生植物生长。植物已经进化出各种策略来应对这些挑战,其中之一是与丛枝菌根真菌(AMF)形成共生关系(高达80%的陆生植物物种)。AMF为寄主植物提供各种益处,例如营养吸收、耐受性、食草动物防御和抗病能力,以换取糖和脂质(…...

libevent源码跨平台编译(windows/macos/linux)

1.windows编译: 克隆: git clone https://github.com/libevent/libevent.git 克隆成功 生成makefile 生成成功 默认不支持OpenSSL,MbedTLS,ZLIB这三个库 编译: cmake --build . --config release...

idea+tomcat+mysql 从零开始部署Javaweb项目(保姆级别)

文章目录 新建一个项目添加web支持配置tomcat优化tomcat的部署运行tomcatidea数据库连接java连接数据库 新建一个项目 new project;Java;选择jdk的版本;next;next;填写项目名字,选择保存的路径;…...

LeetCode 每日一题 2024/5/27-2024/6/2

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 5/27 2028. 找出缺失的观测数据5/28 2951. 找出峰值5/29 2981. 找出出现至少三次的最长特殊子字符串 I5/30 2982. 找出出现至少三次的最长特殊子字符串 II5/31 2965. 找出缺…...

BOOST_SREATCH

BOOST Boost是一个由C社区开发的开源库,为C语言标准库提供扩展。这个库由C标准委员会库工作组成员发起,旨在提供大量功能和工具,帮助C开发者更高效地编写代码。Boost库强调跨平台性和对标准C的遵循,因此与编写平台无关&#xff0…...

MySQL学习——获取数据库和表格的信息

如果忘记了数据库或表的名称,或者不确定给定表的结构(例如,其列的名称),该怎么办呢?MySQL通过几个语句解决了这个问题,这些语句提供了有关它支持的数据库和表的信息。 你之前已经看过SHOW DATA…...

Go语言redis框架 — go-redis

https://zhuanlan.zhihu.com/p/645669818 一、简述 1. API友好,命令名称和参数与Redis原生命令一致,使用简单方便。 2. 支持完整的Redis命令集,覆盖了字符串、哈希、列表、集合、有序集合、HyperLogLog等数据结构。 3. 支持连接池&#x…...

C++ | Leetcode C++题解之第125题验证回文串

题目&#xff1a; 题解&#xff1a; class Solution { public:bool isPalindrome(string s) {int n s.size();int left 0, right n - 1;while (left < right) {while (left < right && !isalnum(s[left])) {left;}while (left < right && !isalnu…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能

指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...

Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解

文章目录 一、开启慢查询日志&#xff0c;定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...

前端调试HTTP状态码

1xx&#xff08;信息类状态码&#xff09; 这类状态码表示临时响应&#xff0c;需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分&#xff0c;客户端应继续发送剩余部分。 2xx&#xff08;成功类状态码&#xff09; 表示请求已成功被服务器接收、理解并处…...