简谈设计模式之设计原则

设计模式是软件工程中解决特定问题的通用解决方案。这些模式提供了设计结构和最佳实践,帮助开发者创建灵活、可重用和可维护的代码。

设计模式分类

  • 创建型模式

用于描述"如何创建对象", 它的特点是“将对象的创建和使用分离”. 包括单例, 原型, 工厂方法, 抽象工厂, 建造者等创建型模式

  • 结构型模式

用于描述如何将类或对象按照某种布局组成更大的结构. 包括代理, 适配器, 桥接, 装饰, 外观, 享元, 组合等结构型模式

  • 行为型模式

用于描述类或对象之间怎样相互协作共同完成单个对象无法独立完成的任务, 以及怎样分配职责. 包括模板方法, 策略, 命令, 职责链, 状态, 观察者, 中介者, 迭代器, 访问者, 备忘录, 解释器等行为型模式

设计原则

开闭原则

对拓展开放, 对修改关闭. 在程序需要拓展的时候, 不能去修改原有的代码, 而应该是利用接口或抽象类进行实现或继承, 使得程序的拓展性更好, 易于维护

对于接口或抽象类, 只要抽象得合理, 基本上可以保持架构的稳定, 而具体细节又可以通过抽象类派生的实现类或接口的实现类来拓展

+---------------------+
|      Shape          |
+---------------------+
| + draw(): void      |
+---------------------+/\||
+---------------------+   +---------------------+
|    Circle           |   |   Rectangle         |
+---------------------+   +---------------------+
| + draw(): void      |   | + draw(): void      |
+---------------------+   +---------------------+

里氏代换原则

任何基类出现的地方, 子类一定可以出现 . 即子类可以拓展父类的功能, 但是不能改变父类原有的功能, 子类除了增加新的方法完成新增功能外, 尽量不要重写父类方法

+---------------------+
|      Bird           |
+---------------------+
| + fly(): void       |
+---------------------+/\||
+---------------------+   +---------------------+
|   Sparrow           |   |   Ostrich           |
+---------------------+   +---------------------+
| + fly(): void       |   | + fly(): void       |
+---------------------+   +---------------------+

单一职责原则

每一个类都应该只有一个职责, 也就是每个类只负责一件事情. 有助于减少类之间的耦合, 提高代码的可读性和可维护性

+----------------+
|   UserManager  |
+----------------+
| - addUser()    |
| - removeUser() |
| - updateUser() |
+----------------+
|                |
+----------------+

依赖倒转原则

高层模块不应该依赖低层模块, 两者都应该依赖于其抽象; 抽象不应该依赖于细节, 细节应该依赖于抽象. 有助于减少模块之间的耦合,增强系统的灵活性。

+---------------------+
|      Service        |
+---------------------+
| + operation(): void |
+---------------------+/\||
+---------------------+   +---------------------+
|   ConcreteServiceA  |   |   ConcreteServiceB  |
+---------------------+   +---------------------+
| + operation(): void |   | + operation(): void |
+---------------------+   +---------------------+

接口隔离原则

客户端不应该强迫依赖于它们不使用的方法

+---------------------+
|  IShape             |
+---------------------+
| + draw(): void      |
+---------------------+
+---------------------+
|  IColorable         |
+---------------------+
| + color(): void     |
+---------------------+/\||
+---------------------+   +---------------------+
|   Square            |   |   Circle            |
+---------------------+   +---------------------+
| + draw(): void      |   | + draw(): void      |
| + color(): void     |   | + color(): void     |
+---------------------+   +---------------------+

组合优于继承

优先通过组合而不是继承来达到复用代码的目的

+---------------------+
|   Engine            |
+---------------------+
| + start(): void     |
+---------------------+||||
+---------------------+
|    Car              |
+---------------------+
| - engine: Engine    |
| + start(): void     |
+---------------------+

迪米特原则

一个对象应该对其他对象有最少的了解. 每个模块不应该知道其他模块的内部细节, 对象之间应当通过严格定义的接口进行交互, 而不应该直接访问其他对象的内部结构

+---------------------+
|      Customer       |
+---------------------+
| + getName(): String |
+---------------------+||||
+---------------------+
|      Order          |
+---------------------+
| - customer: Customer|
| + getCustomerName():|
+---------------------+

避免重复原则

每一项知识在系统中都应该有一个唯一的、明确的、权威的表示. 目的是为了避免代码重复, 通过抽象和封装来减少冗余代码, 提高系统的可维护性和可拓展性

+---------------------+
|    UserService      |
+---------------------+
| - validateUser()    |
| - saveUser()        |
+---------------------+/\||
+----------------------------+     +---------------------+
|  UserController            |     |  UserRepository     |
+----------------------------+     +---------------------+
| - userService: UserService |
+----------------------------+

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

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

相关文章

负载均衡(Load Balancing)、集群(Cluster)和分布式(Distributed)

负载均衡(Load Balancing) 定义:负载均衡是指将网络流量或计算任务均匀地分配到多个服务器或计算资源上,以提高系统的整体处理能力、可靠性和响应速度。 特点: 流量分配:负载均衡器根据一定的算法&#x…

HTML5新增的input元素属性:placeholder、required、autofocus、min、max等

HTML5 大幅度地增加与改良了 input 元素的属性,可以简单地使用这些属性来实现 HTML5 之前需要使用 JavaScript 才能实现的许多功能。 下面将详细介绍这些新增的 input 元素的属性。 属性说明属性说明placeholder在输入框显示描述性或提示性文本list为文本框添加选…

React+TS前台项目实战(二十七)-- 首页响应式构建之banner、搜索、统计模块布局

文章目录 前言一、 效果展示二、相关模块1. Statistic统计模块功能分析代码详细注释使用方式 2. Search搜索模块功能分析代码详细注释使用方式 3. banner模块功能分析代码详细注释使用方式 总结 前言 前面我们已经封装了这个项目基本要用到的全局组件了,现在就开始…

ScreenAI ——能理解从信息图表到用户界面的图像和文本算法解析

概述 论文地址:https://arxiv.org/pdf/2402.04615.pdf 信息图表(图表、示意图、插图、地图、表格、文档布局等)能够将复杂的数据和想法转化为简单的视觉效果,因此一直以来都被视为传播的重要元素。这种能力来自于通过布局和视觉线…

在Pycharm中把jupyter notebook转换成md格式

在Pycharm的控制台输入: jupyter nbconvert --to markdown filename.ipynb这里实际上是用的nvconvert 同理,如果是在vscode中写jupyter,也可以用: jupyter nbconvert --to FORMAT notebook.ipynb将其变成ipynb文件(…

普通人必看!AI绘画商业变现全攻略(附教程)

大部分的设计师除了主业以外,都会利用空余时间去接单做副业。 单子包括但不限于产品/品牌LOGO、电商产品图设计、海报、室内设计图等等,单价在几十到上千不等 引起了我的思考,我们普通人有没有机会,也能像他们一样去接单赚钱吗&a…

pytorch- RNN循环神经网络

目录 1. why RNN2. RNN3. pytorch RNN layer3.1 基本单元3.2 nn.RNN3.2.1 函数说明3.2.2 单层pytorch实现3.2.3 多层pytorch实现 3.3 nn.RNNCell3.3.1 函数说明3.3.2 单层pytorch实现3.3.3 多层pytorch实现 4.完整代码 1. why RNN 以淘宝的评论为例,判断评论是正面…

Jackson中ObjectMapper

文章目录 概要ObjectMapper常用方法将Java对象转换为JSON字符串从JSON字符串转换为Java对象读取JSON文件并解析为树结构 概要 ObjectMapper 是 Jackson 数据处理库的核心类,用于将 Java 对象转换为 JSON,以及将 JSON 转换为 Java 对象。 ObjectMapper常…

matplotlib颜色对照表

matplotlib的色彩设置: #------------------------------------------------------------------------------------------------------------------------------- #-------------------------------------------------------------------------------------------------------…

【JavaWeb】登录校验-会话技术(二)JWT令牌

JWT令牌 介绍 JWT全称:JSON Web Token (官网:https://jwt.io/) 定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。 简洁&#xff1a…

vue和react你怎么选择?

在选择Vue和React之间,其实没有一个绝对的“最佳选择”,因为这取决于你的项目需求、团队熟悉度、开发环境、以及你对这两个框架的个人偏好。下面是一些可以帮助你做出决策的因素: 1. 学习曲线 Vue:Vue的学习曲线相对平缓&#xf…

Android Camera API发展历程

Android Camera API发展历程 一、Android Camera API介绍 Android系统中Camera API是用于控制相机设备的主要API,到目前为止,Camera API历史上共历经了三版重要的API。 在Android 5.0之前,主要使用的是Camera API1,但现在已经弃…

如何使用 Puppeteer 避免机器人检测?

为什么有反机器人系统? 保护网站资源和性能 爬虫和机器人程序在短时间内可以发送大量请求,消耗服务器资源,导致网站性能下降甚至崩溃。 反机器人系统可以帮助网站管理和限制这些请求,从而保持网站的稳定性和可用性。 防止数据…

借助软件资产管理系统,优化Solidworks软件许可证管理

在当今数字化的企业环境中,软件许可证的有效管理对于业务的顺畅运行至关重要。然而,IT 运维部门常常面临着诸如用户部门 SW 许可证不够用、使用紧张等问题,而由于缺乏可靠的数据支持,难以准确判断许可证的短缺程度,这给…

MFC引用C#生成的dll,将dll放置到非exe程序目录,如何操作?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

信创:鲲鹏(arm64)+麒麟(kylin v10)离线部署k8s和kubesphere(含离线部署新方式)

本文将详细介绍,如何基于鲲鹏CPU(arm64)和操作系统 Kylin V10 SP2/SP3,利用 KubeKey 制作 KubeSphere 和 Kubernetes 离线安装包,并实战部署 KubeSphere 3.3.1 和 Kubernetes 1.22.12 集群。 服务器配置 主机名IPCPUOS用途master-1192.168.10…

【linux高级IO(二)】多路转接之select详解

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 Linux高级IO 1. 前言2. 初识s…

TEE共享内存的介绍-共享内存的限制是什么? TA堆内存/栈内存有限制吗?Trustzone/TEE

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】TEE从入门到精通-[目录] 👈👈👈思考: 如何开发一个TA? sdk又是什么?开发一个TA的流程是怎样的?How to do?有关TA的签名介绍TEE开发Secure driver介绍RP…

昇思25天学习打卡营第21天|基于MindSpore实现BERT对话情绪识别

模型简介 BERT全称是来自变换器的双向编码器表征量。与BERT模型相似的预训练语言模型例如问答、命名实体识别、自然语言推理、文本分类等在许多自然语言处理任务中发挥着重要作用。模型是基于Transformer中的Encoder并加上双向的结构。 BERT模型的主要创新点都在pre-train方法…

SCI丨返修一作+通讯

中科四区,JCR2 返修转让一作通讯,5个月左右录用 题目:通过机器学习算法XXXXXXXxxx混凝土力学性能的可靠方法