设计模式基础知识点(七大原则、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)

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

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

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

相关文章

R语言绘图 --- 柱状图(Biorplot 开发日志 --- 3)

「写在前面」 在科研数据分析中我们会重复地绘制一些图形,如果代码管理不当经常就会忘记之前绘图的代码。于是我计划开发一个 R 包(Biorplot),用来管理自己 R 语言绘图的代码。本系列文章用于记录 Biorplot 包开发日志。 相关链接…

目标检测——农业障碍物检测数据集

引言 亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。 …

Kubernetes——YAML文件编写

目录 一、创建Kubernetes对象YAML文件必备字段 1.apiVersion 2.kind 3.metadata 4.spec 二、YAML格式基本规范 1.结构表示 2.键值对 3.列表(数组) 4.字典(映射) 5.数据类型 6.注释 7.多文档支持 8.复杂结构 9.示例 …

Vuex 的安装与配置

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介Vuex 的安装与配置1. 安装 Vuex使用 npm 安装使用 yarn 安装 2. 配置 Vuex创建和配置 store将 store 注入到 Vue 实例中 3. 在组件中使用 Vuex访问 State提交 Mutation分发 Action使用 Getter 原理解析小结 ⭐ 写在最后 ⭐ 专栏简介…

Proxmox 虚拟环境下1Panel Linux 服务器运维管理面板的安装

简介 以前安装服务器管理面板用的都是宝塔,今天发现 1Panel Linux 服务器运维管理面板也很好,面板清晰整洁,使用的技术比较先进,所以我决定亲自安装一下看看效果就竟如何? 1Panel Linux 服务器运维管理面板是一个开源…

vulhub中Jenkins CLI 接口任意文件读取漏洞复现(CVE-2024-23897)

Jenkins是一个开源的自动化服务器。 Jenkins使用[args4j](https://github.com/kohsuke/args4j)来解析命令行输入,并支持通过HTTP、Websocket等协议远程传入命令行参数。args4j中用户可以通过字符来加载任意文件,这导致攻击者可以通过该特性来读取服务器…

目标检测——植物幼种数据集

引言 亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。 …

推荐网站(19)anytools图片分辨率处理网站

今天,我要向您推荐一个非常实用的在线图片处理工具网站——AnyTools。这个网站提供了一站式的图片分辨率处理服务,并且具备添加各种过滤器的功能,非常适合需要快速调整图片大小和风格优化的场合。 多分辨率支持:用户可以自定义图片…

人工智能与【肿瘤免疫微环境】结合,探索免疫治疗的新方向|24年6月·顶刊速递·06-02

罗小罗同学说 24-06-02|文献速递 今天分享的文章,主题是——人工智能&肿瘤免疫微环境。解释一下这张图,左列是文献标题,右侧是发表的年月,放心,都是顶刊,不然我也不会选的。 PS&#xff1a…

力扣刷题--2085. 统计出现过一次的公共字符串【简单】

题目描述 给你两个字符串数组 words1 和 words2 ,请你返回在两个字符串数组中 都恰好出现一次 的字符串的数目。 示例 1: 输入:words1 [“leetcode”,“is”,“amazing”,“as”,“is”], words2 [“amazing”,“leetcode”,“is”] 输出…

一键实现文件夹批量高效重命名:轻松运用随机一个字母命名,让文件管理焕然一新!

在数字化时代,文件夹管理是我们日常生活和工作中不可或缺的一部分。然而,随着文件数量的不断增加,文件夹命名的繁琐和重复成为了一个让人头疼的问题。你是否曾因为手动一个个重命名文件夹而感到枯燥乏味?你是否曾渴望有一种方法能…

开发一个comfyui的自定义节点-支持输入中文prompt

文章目录 目标功能开发环境实现过程翻译中文CLIP编码拓展仓库地址完整代码目标功能 目前comfyui的prompt提示词输入节点 CLIP Text Encode 只支持输入英文的prompt,而有时候我们需要自己制定一些prompt,所以就得将我们想要的提示词翻译为英文后再复制粘贴到该节点的输入框中…

RTA GMH系列 SERIE MOTION电机驱动板手侧 英文版

RTA GMH系列 SERIE MOTION电机驱动板手侧 英文版

【Python系列】Python的多返回值

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

C51学习归纳1 --- led点亮、led闪烁、led流水灯

第一节主要是针对LED的控制学习。这个过程中我们需要掌握的:1、控制的实现方法,控制实现的方法在后续的学习中是通用的。2、如何知道谁控制谁,通过查找开发板原理图获取,原理图的阅读的能力,在日后也是非常常用的。 一…

关于 c++ cout << endl; 的源码解释

这行语句非常常用。以前在王老师课上,老师提到过 endl 是一个函数模板。现给出这行语句的相关源码: 反汇编的依据如下: 接着是 谢谢

yolov8使用:数据格式转换(目标检测、图像分类)多目标跟踪

安装 yolov8地址:https://github.com/ultralytics/ultralytics git clone https://github.com/ultralytics/ultralytics.git安装环境: pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple目标检测 标注格式转换 若使用 labelimg…

【PPT】根据字体大小自动缩放文本框大小

【PPT】根据字体大小自动缩放文本框大小 一般我们新建文本框输入文字后,文本框的大小是不会自动缩放的,是根据你一开始拖动的尺寸固定的 你可以设置文本框的长度随着文字的变化而自动调整。这样,无论你输入多少文字,文本框都会自…

pqgrid的使用

npm安装pqgrid npm install pqgridf --registryhttps://registry.npmmirror.com npm install jquery-ui --registryhttps://registry.npmmirror.comvue文件 <template><div><div id"grid_json"></div></div> </template><s…

Nested KVM Hypervisor Support

Description Nested KVM是指基于虚拟化技术的虚拟机管理系统。 Nested KVM在Intel处理器上&#xff0c;KVM使用Intel的vmx&#xff08;virtualmachine eXtensions&#xff09;来提高虚拟机性能&#xff0c;即硬件辅助虚拟化技术。如果一台虚拟机能够和物理机一样支持vmx&…