设计模式基础知识点(七大原则、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.rhkb.cn/news/338315.html

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

相关文章

Python 关于字符串格式化

在Python中,字符串格式化有以下几种方法: 1.可以使用字符串的str.center(width), str.ljust(width), 和 str.rjust(width)方法来实现字符串的居中、左对齐和右对齐操作。 居中对齐: text "Python" centered_text text.center(10…

pytest-sugar插件:对自动化测试用例加入进度条

摘要 在自动化测试过程中,测试进度的可视化对于开发者和测试工程师来说非常重要。本文将介绍如何使用pytest-sugar插件来为pytest测试用例添加进度条,从而提升测试的可读性和用户体验。 1. 引言 自动化测试是软件开发过程中不可或缺的一部分&#xff…

Django Celery技术详解

文章目录 简介安装和配置创建并调度任务启动Celery Worker在视图中调用异步任务拓展功能 简介 Django Celery 是一个为Django应用程序提供异步任务处理能力的强大工具。它通过与消息代理(如RabbitMQ、Redis)集成,可以轻松地处理需要长时间运…

Windows11 wsl2编译Android14 使用ASfP Debug windows上启动的模拟器

wsl2的安装和配置 安装: 直接百度搜索最新的wsl2安装教程即可,官网:https://learn.microsoft.com/zh-cn/windows/wsl/install 1. 启用适用于 Linux 的 Windows 子系统(以管理员身份打开 PowerShell 并运行) Enable-WindowsOptionalFeature…

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…

fyne apptab布局

fyne apptab布局 AppTabs 容器允许用户在不同的内容面板之间切换。标签要么只是文本&#xff0c;要么是文本和一个图标。建议不要混合一些有图标的标签和一些没有图标的标签。 package mainimport ("fyne.io/fyne/v2/app""fyne.io/fyne/v2/container"//&…

全国产飞腾模块麒麟信安操作系统安全漏洞

1、背景介绍 目前在全国产飞腾模块上部署了麒麟信安操作系统&#xff0c;经第三方机构检测存在以下漏洞 操作系统版本为 内核版本为 openssh版本为 2、openssh CBC模式漏洞解决 首先查看ssh加密信息 nmap --script "ssh2*" 127.0.0.1 | grep -i cbc 可以通过修改/…

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

题目&#xff1a; 题解&#xff1a; class Solution:def isPalindrome(self, s: str) -> bool:n len(s)left, right 0, n - 1while left < right:while left < right and not s[left].isalnum():left 1while left < right and not s[right].isalnum():right - …

【linux】运维-基础知识-认知hahoop周边

1. HDFS HDFS&#xff08;Hadoop Distributed File System&#xff09;–Hadoop分布式文件存储系统 源自于Google的GFS论文&#xff0c;HDFS是GFS的克隆版 HDFS是Hadoop中数据存储和管理的基础 他是一个高容错的系统&#xff0c;能够自动解决硬件故障&#xff0c;eg&#xff1a…

进程与线程(四)

进程与线程&#xff08;四&#xff09; 基于System V IPC对象的进程间通信机制SystemV IPC引入查看Linux系统中IPC工具的方式查看所有IPC工具命令&#xff1a;ipcs 查看指定的IPC工具key值获取方法&#xff1a;ftok()函数 消息队列消息队列的特征&#xff1a;消息队列的操作打开…

Jmeter实战教程入门讲解

前言 通过前面对Jmeter元件的讲解&#xff0c;大家应该都知道常用元件的作用和使用了。编写Jmeter脚本前我们需要知道Jmeter元件的执行顺序&#xff0c;可以看看我这篇性能测试学习之路&#xff08;三&#xff09;—初识Jmeter来了解下。下面我将以工作中的一个简单的实例带大…

使用ssh连接ubuntu

一、下载连接工具 常见的连接工具右fianlshell、xshell等等。在本文章中使用的finalshell&#xff0c;工具可以去官网上下载&#xff0c;官网下载。 二、Ubuntu中配置shh 1、使用下面指令更新软件包&#xff08;常用于下载安装或更新软件时使用&#xff0c;更新到最新的安装…

正邦科技(day1)

1&#xff1a;充电桩工作了两个半小时&#xff0c;已用电量13度电&#xff08;一般的话是一个小时7度电&#xff09; 2&#xff1a;火线&#xff08;红色&#xff0c;棕色&#xff09;&#xff0c;零线&#xff08;蓝色&#xff09; 3&#xff1a;充电桩工作了两个半小时&#…

(自适应手机端)响应式服装服饰外贸企业网站模板

(自适应手机端)响应式服装服饰外贸企业网站模板PbootCMS内核开发的网站模板&#xff0c;该模板适用于服装服饰网站、外贸网站等企业&#xff0c;当然其他行业也可以做&#xff0c;只需要把文字图片换成其他行业的即可&#xff1b;自适应手机端&#xff0c;同一个后台&#xff0…

【C++集群聊天服务器(一)】|Linux平台资源受限下boost库和muduo网络库源码编译安装

本人使用的服务器是2G2核 ubuntu22.04 前置工作 muduo库源码github仓库地址&#xff1a; muduo WIndows和Linux平台的boost源码包下载(zip是Windows版&#xff0c;tar.gz是Linux版&#xff0c;你也可以去boost官网下载最新版本) Boost C Libraries 由于muduo网络库是基于boo…

2024年海南省三支一扶报名指南,照片要求

2024年海南省三支一扶报名指南&#xff0c;照片要求 一、考试时间安排&#xff1a; 报名时间&#xff1a;6月1日8:00至6月7日18:00 准考证打印时间&#xff1a;6月17日8:00 考试时间&#xff1a;6月22日 二、招聘人数 海南省计划招募390名高校毕业生

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

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

Linux入门攻坚——24、BIND编译安装、Telnet和OpenSSH

BIND编译安装 对于没有rpm包&#xff0c;需要源代码编译安装。 1、下载源代码&#xff1a;bind-9.12.2-P1.tar.gz&#xff0c;解压&#xff1a;tar -xf bind-9.12.2-P1.tar.gz 2、完善环境&#xff1a; 1&#xff09;增加用户组named&#xff1a;groupadd -g 53 named 2&…

正邦科技(day4)

烧录 一、烧录固件二、 通讯模块升级1&#xff1a;USB的方式升级固件2&#xff1a;通过mqtt的方式升级固件3&#xff1a;切换环境 三、 烧录WiFi1&#xff1a;短接2&#xff1a;烧录脚本 设备注意事项&#xff1a; 第一种方式&#xff1a;通信模组和MCU都可以统一烧录BoodLoade…

Vue进阶之Vue无代码可视化项目(一)

Vue无代码可视化项目 项目搭建初始步骤拓展:工程项目从0-1项目规范化package.jsoncpell.jsoncustom-words.txtts-eslint规则.eslintrc.cjsgit钩子检查有没有问题type-checkspellchecklint:stylehusky操作安装pre-commitpnpm的commit规范package.json:commitlint.config.cjs安装…