简谈设计模式之设计原则

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

设计模式分类

  • 创建型模式

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

  • 结构型模式

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

  • 行为型模式

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

设计原则

开闭原则

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

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

+---------------------+
|      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.mfbz.cn/a/784855.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

外卖跑腿小程序APP软件成品系统和软甲开发APP小程序可进行封装打包

,用户友好界面设计 首先,外卖施限小程序APP应具备用户友好的界面设计。界面应简洁明了,让用户能够方便快捷地议,览和选择所需的菜品或服务。系统应提供详细的菜品描述、价格透明,并允许用户根据口味、偏好进行结进和排序。此外&am…

如何保证队列消息的有序性

要保证队列消息的有序性,你可以采取以下几种策略: 1.单一生产者和消费者:确保只有一个生产者向队列发送消息,以及只有一个消费者从队列接收消息,这样可以保证消息的顺序。 2.使用有序集合:如果你使用Redis&…

GPU发展史(二):改变游戏规则的3Dfx Voodoo

小伙伴们,大家好呀,我是老猫。 在上一篇GPU发展史(一)文章中,我们介绍了1976-1995期间早期显卡的发展故事,今天我们将介绍在1995-1999年这段时间显卡的故事,而这段故事的主角就是——3Dfx 提起…

在idea中查看某个接口的所有实现类图

一、选中某个接口右键 ---> Diagrams ---> show Diagrams,然后就会进入一个新的 tab 页; 二、然后在出来的图上选中某个接口右键 ---> show Implementations,就会显示选中接口的所有实现类列表; 三、最后 ctrl A 全部选…

StarRocks下载使用说明和基础操作

简介 StarRocks 是一款高性能分析型数据仓库,使用向量化、MPP 架构、CBO、智能物化视图、可实时更新的列式存储引擎等技术实现多维、实时、高并发的数据分析。StarRocks 既支持从各类实时和离线的数据源高效导入数据,也支持直接分析数据湖上各种格式的数…

普中51单片机:矩阵按键扫描与应用详解(五)

文章目录 引言电路图开发板IO连接矩阵键盘的工作原理行列扫描逐行/逐列扫描 LCD1602代码库代码演示——暴力扫描代码演示——数码管(行列式)代码演示——线翻转法代码演示——LCD1602密码锁 引言 矩阵按键是一种通过行列交叉连接的按键阵列,可以有效地减少单片机I/…

萝卜快跑的狠活

萝卜快跑作为百度旗下的自动驾驶出行服务平台,在科技应用上展现了多项领先的技术。以下是萝卜快跑采用的一些主要科技“狠活”: 自动驾驶技术: 萝卜快跑主要使用了百度Apollo的L4级自动驾驶技术,该技术能够应对海量的城市道路场景…

Vue的常见指令

目录 1.v-bind 2. class绑定 3.style绑定 4.v-if/v-show 1.v-bind v-bind指令用于绑定属性 可以简写成 “ &#xff1a;” 它的作用就是我们可以动态的定义属性的值&#xff0c;比如常见的<img src "1.jpg"> 我们如果想要修改图片就需要获取到DOM对象&am…

Nginx:关于实现跨域代理

运维专题 Nginx&#xff1a;关于实现跨域代理 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.ne…

科普文:分布式系统的架构设计模式

一、分布式架构基本概念 分布式架构是一种计算机系统设计方法&#xff0c;它将一个复杂的系统划分为多个自治的组件或节点&#xff0c;并通过网络进行通信和协作。每个组件或节点在功能上可以相互独立&#xff0c;但又能够通过消息传递或共享数据来实现协同工作。分布式架构主要…

为什么独立站需要高质量的GPB外链?

独立站需要高质量的GPB外链&#xff0c;主要是因为它们能显著提升网站的可信度和可见性。高质量的外链相当于得到其他权威网站的认可和推荐&#xff0c;这会让搜索引擎认为你的内容有价值&#xff0c;从而提升你的搜索排名。试想一下&#xff0c;当其他有影响力的网站愿意链接到…

设计模式7-装饰模式

设计模式7-装饰模式 写在前面动机模式定义结构代码推导原始代码解决问题分析 选择装饰模式的理由1. 职责分离&#xff08;Single Responsibility Principle&#xff09;2. 动态扩展功能3. 避免类爆炸4. 开闭原则&#xff08;Open/Closed Principle&#xff09;5. 更好的组合复用…

如何忽略部分文件或者文件夹在git提交项目时

嗨&#xff0c;我是兰若&#xff0c;最近发现有些小伙伴在提交代码时&#xff0c;总是把不该提交的文件&#xff0c;比如说本地批跑的缓存文件给提交到了git上面&#xff0c;导致别人在拉取代码的时候&#xff0c;也会把这部分文件拉取到自己本地&#xff0c;从而导致和本地的缓…

深度学习(笔记内容)

1.国内镜像网站 pip使用清华源镜像源 pip install <库> -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip使用豆瓣的镜像源 pip install <库> -i https://pypi.douban.com/simple/ pip使用中国科技大学的镜像源 pip install <库> -i https://pypi.mirro…

PyCharm如何安装requirements.txt中的依赖包

问题&#xff1a;下载别人的源码&#xff0c;如何安装代码中requirement.txt中的依赖包。 解决方案&#xff1a; &#xff08;1&#xff09;打开PyCharm下面的Terminal&#xff0c;先为代码创建单独的虚拟环境并进入到虚拟环境中&#xff08;每个项目单独的环境&#xff0c;这…

HINet: Half Instance Normalization Network for Image Restoration

论文&#xff1a;HINet: Half Instance Normalization Network for Image Restoration Abstract&#xff1a; 在本文中&#xff0c;我们探讨了实例归一化在低级视觉任务中的作用。 具体来说&#xff0c;我们提出了一个新颖的块&#xff1a;半实例归一化块&#xff08;HIN 块&…

Oracle 19c 统一审计表清理

zabbix 收到SYSAUX表空间告警超过90%告警&#xff0c;最后面给出的清理方法只适合ORACLE 统一审计表的清理&#xff0c;传统审计表的清理SYS.AUD$不适合&#xff0c;请注意。 SQL> Col tablespace_name for a30 Col used_pct for a10 Set line 120 pages 120 select total.…

Linux系统下的用户管理模式

Linux系统下的用户管理模式 本文以属于Linux系统基本概念&#xff0c;如果以查找教程教程&#xff0c;解决问题为主&#xff0c;只需要查看本文后半部分。 如需要系统性学习请查看本文前半部分。 文章目录 Linux系统下的用户管理模式1. Linux下用户的概念2. 创建不同类型的用户…

C++继承(一文说懂)

目录 一&#xff1a; &#x1f525;继承的概念及定义1.1 继承的概念1.2 继承定义1.2.1 定义格式1.2.2 继承关系和访问限定符1.2.3 继承基类成员访问方式的变化 二&#xff1a;&#x1f525;基类和派生类对象赋值转换三&#xff1a;&#x1f525;继承中的作用域四&#xff1a;&a…

SpringSecurity中文文档(Servlet Authorization Architecture )

Authorization 在确定了用户将如何进行身份验证之后&#xff0c;还需要配置应用程序的授权规则。 Spring Security 中的高级授权功能是其受欢迎的最有说服力的原因之一。无论您选择如何进行身份验证(无论是使用 Spring Security 提供的机制和提供者&#xff0c;还是与容器或其…