设计模式学习笔记(一):基本概念;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…

【技能树学习】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…

若依整合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…

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

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

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

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

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

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

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

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

Android平台GB28181设备接入模块实现后台service按需回传摄像头数据到国标平台侧

技术背景 我们在做Android平台GB28181设备对接模块的时候&#xff0c;遇到这样的技术需求&#xff0c;开发者希望能以后台服务的形式运行程序&#xff0c;国标平台侧没有视频回传请求的时候&#xff0c;仅保持信令链接&#xff0c;有发起视频回传请求或语音广播时&#xff0c;…

数字孪生网络攻防模拟与城市安全演练

在数字化浪潮的推动下&#xff0c;网络攻防模拟和城市安全演练成为维护社会稳定的不可或缺的环节。基于数字孪生技术我们能够在虚拟环境中进行高度真实的网络攻防模拟&#xff0c;为安全专业人员提供实战经验&#xff0c;从而提升应对网络威胁的能力。同时&#xff0c;在城市安…

GEE数据集——全球健康地图项目Global Healthsites Mapping Project

Global Healthsites Mapping Project Healthsites.io和全球健康网站绘图项目的使命是帮助向政府、非政府组织和私营部门提供准确的最新健康设施信息。医疗机构登记簿是一个国家内运作良好的医疗信息系统的基石。准确和最新的数据提供了基础数据&#xff0c;有助于推动服务可用…

5分钟掌握接口自动化测试,4个知识点简单易学!

一. 什么是接口测试 接口测试是一种软件测试方法&#xff0c;用于验证不同软件组件之间的通信接口是否按预期工作。在接口测试中&#xff0c;测试人员会发送请求并检查接收到的响应&#xff0c;以确保接口在不同场景下都能正常工作。 就工具而言&#xff0c;常见的测试工具有…

16-Verilog实现二线制I2C CMOS串行EEPROM的读写操作

Verilog实现二线制I2C CMOS串行EEPROM的读写操作 1&#xff0c;二线制I2C CMOS串行EEPROM的简单介绍2&#xff0c;I2C总线特征介绍3&#xff0c;二线制I2C、CMOS串行EEPROM的读写操作4&#xff0c;EEPROM的Verilog HDL程序4.1&#xff0c;EEPROM的行为模型思路如下&#xff1a;…

【Kotlin】Kotlin环境搭建

1 前言 Kotlin 是一种现代但已经成熟的编程语言&#xff0c;由 JetBrains 公司于 2011 年设计和开发&#xff0c;并在 2012 年开源&#xff0c;在 2016 年发布 v1.0 版本。在 2017 年&#xff0c;Google 宣布 Kotlin 正式成为 Android 开发语言&#xff0c;这进一步推动了 Kotl…

【Go】一、Go语言基本语法与常用方法容器

GO基础 Go语言是由Google于2006年开源的静态语言 1972&#xff1a;&#xff08;C语言&#xff09; — 1983&#xff08;C&#xff09;—1991&#xff08;python&#xff09;—1995&#xff08;java、PHP、js&#xff09;—2005&#xff08;amd双核技术 web端新技术飞速发展&…

【Python程序开发系列】聊一聊github的pull request几种合并方式

一、什么是PR 在正常的工作流程中&#xff0c;PR 用于将一个分支的更改合并到另一个分支&#xff0c;而这些更改通常以提交的形式存在。每个提交都有一个唯一的提交 ID&#xff0c;用于标识和跟踪更改的历史。因此一般情况下PR包含源分支的多个commit提交记录&#xff08;pr_co…

数据结构_找环,破环题-2.5

一. 判断单链表有无环 a. 错误的思路&#xff1a;遍历陷入死循环 1&#xff09;和相交的遍历思路一样&#xff0c;找指向相同。 错误点 一直在死循环。 思考点&#xff1a;如何破环 b. 个人思路&#xff1a;反转链表回首结点 1&#xff09;目前的经验&#xff0c;无非就…

无人机集群协同导航构型自适应选择算法

无人机集群协同导航构型自适应选择算法 Evandworld E-mail&#xff1a;evandworldfoxmail.com 摘要 针对卫星定位系统用于无人机集群时成本高、精度低等问题&#xff0c;本文提出一种基于卡尔曼滤波和概率的无人机集群构型自适应选择算法。在自适应扩展卡尔曼滤波的基础上&a…