设计模式学习笔记(一):基本概念;UML

文章目录

  • 参考
  • 面向对象的设计原则
      • 创建型模式
      • 结构型模式
      • 行为型模式
  • UML
    • 视图
    • 图(Diagram)
    • 模型元素(Model Element)
    • 通用机制
    • 类之间的关系
      • 关联关系
        • 复杂!!
        • 聚合关系
        • 组合关系
      • 依赖关系
      • 泛化关系
      • 接口与实现关系

参考

https://github.com/faif/python-patterns

  • 封装
    对象的行为对于外部世界来说是不可见的,或者说对象的状态信息是私密的。
    客户端不能通过直接操作来改变对象的内部状态。相反,客户端需要通过发送消息来请求对象改变其内部状态。对象可以根据请求的类型,通过特定的成员函数(例如get和set)改变它们的内部状态,以做出相应的响应。

  • 多态
    多态有两种类型。对象根据输入参数提供方法的不同实现。不同类型的对象可以使用相同的接口。

  • 继承
    继承表示一个类可以继承父类的(大部分)功能。
    继承被描述为一个重用基类中定义的功能并允许对原始软件的实现进行独立扩展的选项.
    继承可以利用不同类的对象之间的关系建立层次结构。与Java不同,Python支持多重继承(继承多个基类)

  • 抽象
    它提供了一个简单的客户端接口,客户端可以通过该接口与类的对象进行交互,并可以调用该接口中定义的各个方法。
    它将内部类的复杂性抽象为一个接口,这样客户端就不需要知道内部实现了。

  • 组合
    它是一种将对象或类组合成更复杂的数据结构或软件实现的方法。
    在组合中,一个对象可用于调用其他模块中的成员函数,这样一来,无需通过继承就可以实现基本功能的跨模块使用。

面向对象的设计原则

  • 开放/封闭原则规定,类或对象及其方法对于扩展来说,应该是开放的,但是对于修改来说,应该是封闭的。

    • 现有的类不会被修改,因此退化的可能性较小。
    • 它还有助于保持以前代码的向后兼容性
  • 控制反转原则是指,高层级的模块不应该依赖于低层级的模块,它们应该都依赖于抽象。细节应该依赖于抽象,而不是抽象依赖于细节

    • 消弱了模块间的紧耦合,因此消除了系统中的复杂性/刚性。
    • 由于在依赖模块之间有一个明确的抽象层(由钩子或参数提供),因此便于通过更好的方式处理模块之间的依赖关系。
  • 接口隔离

  • 单一职责

  • 替换原则,派生类必须能够完全取代基类。它还建议派生类应该尽可能对基类封闭,以至于派生类本身可以替换基类,而无需修改任何代码

上下文

  • 参与者:它们是在设计模式中用到的类。类可以在模式中扮演不同的角色,以完成多个目标。
  • 非功能需求:诸如内存优化、可用性和性能等需求都属于此类型。由于这些因素影响整个软件解决方案,因此至关重要。
  • 权衡
  • 结果

创建型模式

  • 它们致力于设计出能够通过组合获得更强大功能的对象和类的结构。
  • 重点是简化结构并识别类和对象之间的关系。
  • 它们主要关注类的继承和组合。

结构型模式

  • 它们致力于设计出能够通过组合获得更强大功能的对象和类的结构。
  • 重点是简化结构并识别类和对象之间的关系。
  • 它们主要关注类的继承和组合。

行为型模式

行为型模式具有下列性质。• 它们关注对象之间的交互以及对象的响应性。• 对象应该能够交互,同时仍然保持松散耦合。

在这里插入图片描述

UML

在这里插入图片描述

  • 关联关系
    • 双向
    • 单向
    • 自关联
    • 多重
      • 在关联直线上用一个数字或一个数字范围表示
    • 聚合
      • 关系表示整体与部分的关系。在聚合关系中,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在
      • 空心菱形,直线
    • 组合
      • 整体与部分同生共死
      • 实心菱形,直线
  • 依赖关系
    • 体现在某个类的方法使用另一个类的对象作为参数
    • 带箭头的虚线
  • 泛化关系
    • 继承
    • 空心三角形,直线
  • 接口与实现
    • 空心三角形,虚线

视图

UML视图包括用户视图、结构视图、行为视图、实现视图和环境视图。其中,用户视图以用户的观点表示系统的目标,它是所有视图的核心,用于描述系统的需求;结构视图表示系统的静态行为,描述系统的静态元素,如包、类与对象,以及它们之间的关系;行为视图表示系统的动态行为,描述系统的组成元素(如对象)在系统运行时的交互关系;实现视图表示系统中逻辑元素的分布,描述系统中物理文件以及它们之间的关系;环境视图表示系统中物理元素的分布,描述系统中硬件设备以及它们之间的关系

图(Diagram)

模型元素(Model Element)

同一个模型元素都必须保持相同的意义并具有相同符号。

通用机制

类图用例图是使用频率最高的两种 UML 图。用于描述系统中所包含的类以及它们之间的相互关系。
在设计模式中,可以使用类图来描述一个模式的结构并对每一个模式实例进行分析。
类图(Class Diagram)是用出现在系统中的不同类来描述系统的静态结构,主要用来描述不同的类以及它们之间的关系。

在这里插入图片描述

类之间的关系

关联关系

关联 association, 是类与类之间最常用的一种关系,是一种结构化的关系。

用实线连接

在使用类图表示关联关系时可以在关联线上标注角色名,一般使用一个表示二者之间关系的动词或者名词表示角色名(有时该名词为实例对象名),关系的两端代表两种不同的角色。因此,在一个关联关系中可以包含两个角色名,角色名不是必需的,可以根据需要增加,其目的是使类之间的关系更加明确。

  • 双向关联
    在这里插入图片描述

  • 单向关联
    在这里插入图片描述
    在这里插入图片描述

复杂!!

在这里插入图片描述

聚合关系

表示整体与部分的关系。

用带空心菱形的直线表示。
在这里插入图片描述

在代码实现聚合关系时,成员对象通常作为构造方法、Setter方法或业务方法的参数注入整体对象中。

组合关系

也表示整体与部分的关系。但在组合关系中整体对象可以控制成员对象的生命周期。
用带实心菱形的直线表示。
在这里插入图片描述

依赖关系

依赖(Dependency)关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。

泛化关系

泛化(Generalization)关系也就是继承关系,用于描述父类与子类之间的关系,父类又称作基类或超类,子类又称作派生类。在UML中,泛化关系用带空心三角形的直线来表示。

在这里插入图片描述

接口与实现关系

类与接口之间的实现关系用带空心三角形的虚线来表示。
在这里插入图片描述

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

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

相关文章

2.0 Zookeeper 安装配置

Linux 安装 zookeeper 下载地址为: Apache ZooKeeper。 选择一稳定版本,本教程使用的 release 版本为3.4.14,下载并安装。 打开网址 https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz,看到如下界…

c#cad 创建-圆(二)

运行环境 vs2022 c# cad2016 调试成功 一、代码说明 这段代码是一个AutoCAD插件,用于在模型空间中创建一个圆形。 首先,我们需要定义一个命令类CreateCircleCommand,并在命名空间CreateCircleInCad中声明。 在CreateCircleCommand类中&a…

h5页面内嵌到app,解决ios无法使用左右侧滑返回上一页

背景:vuevant组合开发的h5页面,嵌入多个app,其中安卓手机都可实现侧滑返回上一页,而苹果端不行,app本身不展示title顶部的返回箭头。 解决办法:判断机型,处理ios端监听左右滑动事件,结合transit…

Java中的深拷贝和浅拷贝

在 Java 中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是两种不同的对象复制方式,它们在处理对象复制时的行为有所不同。 一、定义 浅拷贝(Shallow Copy) 浅拷贝是指创建一个新对象…

【技能树学习】Git入门——练习题解析

前言 本篇文章给出了Git入门技能树中部分的练习题解析,包括分支管理,Git标签,在Mac和Windows上使用GitVSCode的步骤。强调了git cherry-pick不直接支持从标签中选择提交,git tag -d只能删除本地标签,Mac系统的终端可以…

23、数据结构/查找相关练习20240205

一、请编程实现哈希表的创建存储数组{12,24,234,234,23,234,23},输入key查找的值&#xff0c;实现查找功能。 代码&#xff1a; #include<stdlib.h> #include<string.h> #include<stdio.h> #include<math.h> typedef struct Node {int data;struct n…

flutter使用webview_flutter在安卓和ios上打开网页

webview_flutter仓库地址&#xff1a;webview_flutter | Flutter package github地址&#xff1a;https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter 要打开非https协议的网页&#xff0c;需要在安卓平台上添加权限&#xff1a;andro…

C++ [NOIP2007 提高组] 矩阵取数游戏

有一个n行m列的矩阵&#xff0c;每个格子中有一个正整数。现在要从左上角的格子(1, 1)出发&#xff0c;每次只能向下或向右走一格&#xff0c;最后到达右下角的格子(n, m)。在走过的格子中取数&#xff0c;求取得的数的和的最大值。 输入&#xff1a; 第一行包含两个整数n和m&a…

若依整合mybatis-plus

文章目录 1.注释掉原本的MybatisConfig2. 将mybatis的配置文件改为mybatis-plus文件 ##前言 出先下列异常&#xff1a; 请求地址’/prod-api/user’,发生未知异常. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.ruoyi.web.mapper.Us…

HP数组面试题

PHP数组面试题 问题&#xff1a; 如何创建一个空数组和一个带有初始值的数组&#xff1f; 答案&#xff1a; 创建空数组&#xff1a;可以使用array()函数或空数组语法[]来创建一个空数组&#xff0c;例如$arr array();或$arr [];。创建带有初始值的数组&#xff1a;可以在创建…

C# BackgroundWorker的使用

C# 中的 BackgroundWorker 类是 .NET Framework 提供的一个组件&#xff0c;用于在后台线程上异步执行长时间运行的操作&#xff0c;同时保持与用户界面&#xff08;UI&#xff09;的交互&#xff0c;如更新进度信息或处理取消请求。这使得可以轻松地在不冻结UI的情况下执行耗时…

003集—三调数据库添加三大类字段——arcgis

在国土管理日常统计工作中经常需要用到三大类数据&#xff08;农用地、建设用地、未利用地&#xff09;&#xff0c;而三调数据库中无三大类字段&#xff0c;因此需要手工录入三大类字段&#xff0c;并根据二级地类代码录入相关三大类名称。本代码可一键录入海量三大类名称统计…

什么是Java中的垃圾回收器,你能解释一下不同种类的垃圾回收算法吗?

什么是Java中的垃圾回收器&#xff0c;你能解释一下不同种类的垃圾回收算法吗&#xff1f; 在Java中&#xff0c;垃圾回收器是一种负责自动管理内存的机制&#xff0c;它负责检测和回收不再使用的对象&#xff0c;释放它们占用的内存空间。垃圾回收器的存在大大简化了程序员对…

数字图像处理(实践篇)四十五 OpenCV-Python 使用ORB算法(包括算法概述)检测图像上的特征点

目录 一 ORB算法 二 涉及的函数 三 实践 ORB: An efficient alternative to SIFT or SURF SIFT 和 SURF 已获得专利,使用需要付费。但是ORB并不需要。ORB 最重要的一点是它来自“

学习总结13

# 最大正方形 ## 题目描述 在一个 n* m 的只包含 0 和 1 的矩阵里找出一个不包含 0 的最大正方形&#xff0c;输出边长。 ## 输入格式 输入文件第一行为两个整数 n,m(1< n,m< 100)&#xff0c;接下来 n 行&#xff0c;每行 m 个数字&#xff0c;用空格隔开&#xff0…

【日常总结】SourceTree 1.5.2.0 更换用户名称和密码

一、场景 二、问题 三、解决方案 > 方案一&#xff1a;删除缓存文件 > 方案二&#xff1a;更新最新版本&#xff0c;可以直接修改密码&#xff08;推荐&#xff09; 方案一&#xff1a;删除缓存文件 Stage 1&#xff1a;设置显示隐藏文件 Stage 2&#xff1a;打开…

SouthernBiotech重组单克隆二抗

您是否在二抗的使用中遇到以下情况&#xff1a; 亲和力低&#xff0c;非特异性强&#xff1f; 稳定性差&#xff0c;批间差异大&#xff1f; SouthernBiotech(欣博盛生物)新推出重组单克隆二抗可避免出现以上问题&#xff01; 虽然传统多克隆二抗在实验中扮演很重要的角色&a…

linux上部署ftp服务

今天同事让帮忙部署一个ftp服务,以前折腾过几次,不过总会有奇奇怪怪的问题.今天的 话结合chatglm4,整理了一下部署. 在CentOS 7上部署FTP服务&#xff0c;可以使用VSFTP&#xff08;Very Secure FTP Daemon&#xff09;&#xff0c;这是一个安全、快速的FTP服务器。以下是部署F…

070:vue+cesium: 利用canvas设置线性渐变色材质

第070个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置线性渐变色的材质,这里使用canvas的辅助方法。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共104行)专栏目标示例效果 配置方式 1)查看基础…

题解:CF1918D(D. Blocking Elements)

题解&#xff1a;CF1918D&#xff08;D. Blocking Elements&#xff09; 一、 读题 1. 题目链接 &#xff08;1&#xff09; 洛谷链接 洛谷链接 &#xff08;2&#xff09; CF链接 CF链接 2. 题意简述 已知一个长度为 n n n 的数组 a a a&#xff0c;构造一个数组 b…