设计模式 基本认识

文章目录

  • 设计模式的作用
  • 设计模式三原则
  • 设计模式与类图
  • 设计模式的分类

设计模式的作用

设计模式是在软件设计过程中针对常见问题的解决方案的一种通用、可重用的解决方案。设计模式提供了一种经过验证的方法,可以帮助开发人员解决特定类型的问题,并在软件设计中提供一种结构化的方法。

大白话:设计模式是大佬实践得出的代码框架。

设计模式三原则

  1. 单一职责原则(Single Responsibility Principle,SRP):

一个类应该只有一个引起变化的原因,即一个类应该只负责一种职责。
这个原则的核心思想是将一个类的功能划分得更加清晰,避免一个类承担过多的责任。

  1. 开放-封闭原则(Open-Closed Principle,OCP)

软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
这意味着在不修改现有代码的情况下,可以通过扩展来实现新的功能或变化。

  1. 依赖倒置原则(Dependency Inversion Principle,DIP)
    ①高层模块不应该依赖于低层模块,二者都应该依赖于抽象。
    ②抽象不应该依赖于细节,细节应该依赖于抽象。
    这个原则强调使用接口和抽象类来减少模块之间的直接依赖,从而提高代码的灵活性和可维护性。

对依赖倒置原则的解释:
①:高模块可以理解后定义的具体类,低模块则指后定义的具体类(这里说的具体类指对接口类的实现)抽象指的是含有虚函数的类,常常是接口类。
②: 实现非虚类时要通过接口类确认要实现哪些细节,而不是为了适应细节去调整接口类。

设计模式与类图

  1. 总体认识:
    (网上随便找的一张类图,不用看懂)
    在这里插入图片描述

  2. 单个类的属性描述规则

属性名称:
属性名称通常以小写字母开头,可以使用驼峰命名法或下划线命名法。
属性名称应该能够清晰地描述属性所代表的含义。
如果类为接口类,则类目为斜体

属性类型:
属性类型表示属性的数据类型,可以是基本数据类型(如整数、字符串等)或其他类的类型。
在属性名称后面使用冒号(:)来指定属性的数据类型。

属性可见性:
属性可见性表示属性对外部类的可访问性,通常包括公有属性(+)、私有属性(-)、受保护属性(#)等。
可以使用符号表示属性的可见性,例如“+”表示公有属性,“-”表示私有属性,“#”表示受保护属性,“~”表示包内可见属性等。

属性默认值:
属性默认值表示属性在创建对象时的初始值。
可以使用等号(=)来指定属性的默认值。

属性约束:
属性约束表示属性的取值范围或其他约束条件。
可以在属性描述中添加约束条件,例如使用大括号{}表示取值范围,使用括号()表示其他约束条件。

  1. 类之间的关系描述规则

关联关系(Association):

含义: 关联分为三种:
1.A中有B类对象的访问方式
2.A中有B类对象访问方式,B中有A类对象访问方式
3.A中有其他A类对象的访问方式(链表)

一条直线连接两个类,表示两个类之间存在某种关联关系。
可以在关联线上标注关联的名称或角色。
可以使用箭头表示关联的方向。

聚合关系(Aggregation):

含义:A的成份有B、C、D类对象。但析构时,可以不释放它们。

用带空心菱形的直线连接两个类,表示一种整体与部分的关系。
空心菱形指向整体类,表示整体类包含部分类。
聚合关系中,部分类的生命周期可以独立于整体类。

组合关系(Composition):

含义:A的成份有B、C、D。A离开B、C、D就不存在。B、C、D不一起在A中就没意义。

用带实心菱形的直线连接两个类,表示一种强的整体与部分的关系。
实心菱形指向整体类,表示整体类拥有部分类。
组合关系中,部分类的生命周期依赖于整体类。

继承关系(Inheritance):
用带空心箭头的直线连接两个类,表示子类继承父类的属性和方法。
箭头指向父类,表示子类是父类的特化。
子类可以重写父类的方法或添加新的方法。

接口实现关系(Interface Realization):
带虚线箭头的直线连接类和接口,表示类实现了接口定义的方法。
虚线箭头指向接口,表示类实现了接口定义的方法。

依赖关系(Dependency):
带箭头的虚线连接两个类,表示一个类依赖于另一个类。
依赖关系中,一个类的变化可能会影响到另一个类。

下图为关系由弱到强排序
在这里插入图片描述
类图绘制

设计模式的分类

创建型模式(Creational Patterns):
单例模式(Singleton Pattern)
工厂模式(Factory Pattern)
抽象工厂模式(Abstract Factory Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern)

结构型模式(Structural Patterns):
适配器模式(Adapter Pattern)
桥接模式(Bridge Pattern)
组合模式(Composite Pattern)
装饰器模式(Decorator Pattern)
外观模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)

行为型模式(Behavioral Patterns):
责任链模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解释器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
备忘录模式(Memento Pattern)
观察者模式(Observer Pattern)
状态模式(State Pattern)
策略模式(Strategy Pattern)
模板方法模式(Template Method Pattern)
访问者模式(Visitor Pattern)

其中常用的为

  1. 工厂
  2. 单例
  3. 装饰
  4. 策略
  5. 代理
  6. 观察者

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

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

相关文章

用户中心(上)

文章目录 企业做项目流程需求分析技术选型计划初始化项目数据库设计登录/注册⽤户管理(仅管理员可⻅) 初始化项目⼀、前端初始化1.下载nodejs2.Ant Design Pro相关问题1.前端项目启动时报错、无法启动?2.如何初始化前端项目?为什么…

分享一个网站实现永久免费HTTPS访问的方法

免费SSL证书作为一种基础的网络安全工具,以其零成本的优势吸引了不少网站管理员的青睐。要实现免费HTTPS访问,您可以按照以下步骤操作: 一、 选择免费SSL证书提供商 选择一个提供免费SSL证书的服务商。如JoySSL,他们是国内为数不…

【云原生】Docker 实践(一):在 Docker 中部署第一个应用

Docker 实践(一):在 Docker 中部署第一个应用 1.使用 YUM 方式安装 Docker2.验证 Docker 环境3.在 Docker 中部署第一个应用3.1 小插曲:docker pull 报 missing signature key 错误3.2 重新安装 Nginx 1.使用 YUM 方式安装 Docker…

【酱浦菌-爬虫技术细节】解决学术堂爬虫翻页(下一页)问题

首先我们通过css选择器获取页码信息,这里的css选择器,选择的是含有a标签的所有li标签,代码如下: li html_web.css(div.pd_c_xslb_left_fenye ul li>a) for li in li:li_url li.css(a::attr(href)).get()li_num li.css(a::t…

软件测试经理工作日常随记【1】-测试用例

软件测试经理工作日常随记【1】-测试用例 1.测试用例 测试用例,好像是每个讲软测经验的文章的基本输出。各种测试用例的设计及白盒黑盒测试方法重复出现在收集者前面。so,不走寻常路的我,觉得从另外的角度去分享测试用例。日常工作中&#…

深圳厂房高温工厂降温方案

深圳的高温工厂降温方案可以根据具体需求和环境条件进行选择。以下是一些常见的降温方案: 工业冷风机:工业冷风机是一种经济、环保的降温设备,通过水蒸发吸热的原理来降低室内温度。它适用于大型开放空间或通风良好的区域,能够有…

【C++庖丁解牛】C++11---新的类的功能 | 可变参数模板

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 1.新的类功能1.1 默认成员…

合泰杯(HT32F52352)RTC的应用(计时)--->掉电不丢失VBAT(代码已经实现附带源码)

摘要 在HT32F52352合泰单片机开发中,rtc在网上还是挺少人应用的,找了很久没什么资料,现在我根据手册和官方的代码进行配置理解。 RTC在嵌入式单片机中是一个很重要的应用资源。 记录事件时间戳:RTC可以记录事件发生的精确时间&…

什么是域名解析?域名解析的完整流程是什么?如何清理DNS缓存?(附源码)

目录 1、什么是域名? 2、为什么使用域名? 3、域名解析的完整流程 4、调用gethostbyname系统接口将域名解析成IP地址 5、为什么需要清理系统DNS缓存? 6、使用cmd命令清理DNS缓存 7、通过代码去清除系统DNS缓存 C软件异常排查从入门到精…

【入坑存内计算一键指南】存内计算运算原理:算法优化、存储介质探究

一.存内计算 存内计算是一种计算方式,它将计算单元嵌入到内存当中。在传统的计算机运行体系中,如冯诺依曼体系,计算机通常包括存储单元和计算单元两部分。计算机进行运算时,需要先将数据存入主存储器,然后按照顺序从…

Vue3框架

Vue3框架 一.使用create-vue搭建Vue3项目二.组合式API - setup选项1.setup选项的写法和执行时机2.setup中写代码的特点3. script setup 语法糖 三.组合式API - reactive和ref函数1. reactive2. ref3. reactive 对比 ref 四.组合式API - computed五.组合式API - watch1. 侦听单个…

数据结构——时间复杂度与空间复杂度

文章目录 一、算法效率算法的复杂度 二、时间复杂度1.时间复杂度的概念2.大O的渐进表示法3.例子 三、空间复杂度1.空间复杂度概念2.例子 四、常见复杂度对比 一、算法效率 算法的复杂度 算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。 因此…