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

news2024/12/24 3:44:23

文章目录

  • 参考
  • 面向对象的设计原则
      • 创建型模式
      • 结构型模式
      • 行为型模式
  • 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.coloradmin.cn/o/1434747.html

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

相关文章

ubuntu开机报错/dev/nume0n1p2:clean

本来是开机卡在这个界面,经过以下操作,变成这种了 现在的问题变成linux卡在 failed to start NVIDIA Persistence Daemon 按照下面的操作方法,可以有开机界面了。但是输入密码后,一直在登录界面 1.方式一:重新安装显…

回归预测 | Matlab实现OOA-CNN-LSTM-Attention鱼鹰算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制)

回归预测 | Matlab实现OOA-CNN-LSTM-Attention鱼鹰算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制) 目录 回归预测 | Matlab实现OOA-CNN-LSTM-Attention鱼鹰算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制&…

Python爬虫实战 | 京东平台电商API接口采集京东商品京东工业商品详情数据

item_get-获得JD商品详情API测试 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cac…

C++多线程学习[六]: 多线程之间的同步

一、同步问题 实际开发场景中有很多需要同步的情况,例如,音频和视频的同步输出、或者通讯能够第一时间同步接受处理… 二、多线程同步demo 可以看到cond可以阻塞等待(wait)可以通知一个线程(notify_one)也可以通知所有的线程&am…

SQL Server数据库日志查看若已满需要清理的三种解决方案

首先查看获取实例中每个数据库日志文件大小及使用情况,根据数据库日志占用百分比来清理 DBCC SQLPERF(LOGSPACE) 第一种解决方案: 在数据库上点击右键 → 选择 属性 → 选择 文件,然后增加数据库日志文件的文件大小。 第二种解决方案 手动…

如何使用VS Code编写小游戏并实现公网游玩本地游戏【内网穿透】

文章目录 前言1. 编写MENJA小游戏2. 安装cpolar内网穿透3. 配置MENJA小游戏公网访问地址4. 实现公网访问MENJA小游戏5. 固定MENJA小游戏公网地址 前言 本篇教程,我们将通过VS Code实现远程开发MENJA小游戏,并通过cpolar内网穿透发布到公网,分…

细说开源软件的影响力分析

开源软件的影响力分析 一、开源软件如何推动技术创新 开源软件以其开放源代码的特性,极大地推动了全球软件技术的创新和发展。这种开放性不仅使得开发者能够自由地查看、修改和使用源代码,还促进了全球开发者之间的深度协作和交流。 1.1 促进全球协作&…

C/C++内存管理的底层调用逻辑

✨Blog:🥰不会敲代码的小张:)🥰 🉑推荐专栏:C语言🤪、Cpp😶‍🌫️、数据结构初阶💀 💽座右铭:“記住,每一天都是一個新的開始&#x1…

追觅发布多款旗舰新品,双机械臂扫地机器人X40领衔登场

2月2日,追觅科技全球首创仿生“双”机械臂新品发布会在苏州举行。会上,追觅科技中国区总裁郭人杰分享了追觅科技全球化发展的业绩成果。郭人杰称,2019-2023年,追觅科技5年复合年增长率超过100%,增速领跑智能清洁行业&a…

【leetcode题解C++】450.删除二叉搜索树中的节点 and 669.修剪二叉搜索树 and 108.将有序数组转换为二叉搜索树

450. 删除二叉搜索树中的节点 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。 一般来说,删除节点可…

超多制作模板的姓氏头像生成器微信小程序源码

超多制作模板的姓氏头像生成器微信小程序源码,这是一款姓氏头像制作小工具,内含丰富多样的模板提供制作。 以前的基本是固定位置生成,这款制作支持拖拽调整位置,自定义颜色,阴影等等。

2022年9月电子学会青少年软件编程 中小学生Python编程等级考试二级真题解析(判断题)

2022年9月Python编程等级考试二级真题解析 判断题(共10题,每题2分,共20分) 26、字典中的键是唯一的,不能重复。而值对应于键,值是可以重复的。 答案:对 考点分析:考查字典相关知识,字典中的键是唯一的,不允许出现重复;字典的值可以是任意类型的对象,可以是数字、…

(学习日记)2024.02.01:引用变量 / 默认实参 / 一元作用域运算符 / 函数重载

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

Chakra UI:构建 Web 设计的未来

Chakra UI:构建 Web 设计的未来 在当今的Web开发领域,构建现代、可访问的用户界面是一个重要的任务。为了满足这一需求,开发者需要一个强大而易用的UI组件库。而Chakra UI作为一个基于React的开源组件库,正是为了解决这个问题而诞…

6.s081 学习实验记录(五)traps

文章目录 一、RISC-V assembly简介问题 二、Backtrace简介注意实验代码实验结果 三、Alarm简介注意实验代码实验结果 一、RISC-V assembly 简介 git checkout traps,切换到traps分支user/call.c 文件在我们输入 make fs.img 之后会被汇编为 call.asm 文件&#xf…

Mysql架构系列——生产常用的高可用部署模式介绍

模式 高可用模式 Galera Cluster是由Codership开发的MySQL多主集群,包含在MariaDB中,同时支持Percona xtradb、MySQL,是一个易于使用的高可用解决方案,在数据完整性、可扩展性及高性能方面都有可接受的表现。 将会基于Galera C…

SpringBoot注解--04--01--注解@Mapper在IDEA中自动注入警告的解决方案

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 问题原因 解决方案方法1:为 Autowired 注解设置required false方法2:用 Resource 替换 Autowired方法3:在Mapper接口上加上Repo…

elastic-job VS xxl-job

1、Elastic-job介绍 Elastic-job 是由当当网基于quartz 二次开发之后的分布式调度解决方案 , 由两个相对独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成 。Elastic-Job-Lite定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务…

页面单跳转换率统计案例分析

需求说明 页面单跳转化率 计算页面单跳转化率,什么是页面单跳转换率,比如一个用户在一次 Session 过程中访问的页面路径 3,5,7,9,10,21,那么页面 3 跳到页面 5 叫一次单跳,7-9 也叫一次单跳, 那么单跳转化率就是要统计…

贪心算法篇2

“星辰野草&#xff0c;造出无边的天地~” 最⻓递增⼦序列 (1) 题目解析 (2) 算法原理 class Solution { public:int lengthOfLIS(vector<int>& nums) {// 使用dp int n nums.size(), ret 1;// 初始化为1vector<int> dp(n1,1);// 从第二个位置…