什么是设计模式,设计模式的分类和原则
admin
2024-05-08 16:09:19
0

什么是设计模式

设计模式是我们在软件开发过程中,基于特定情况的下为一些重复性出现的问题提供的一个有效的解决方案。无论是在框架还是应用软件的开发中,设计模式的在被广泛的应用。

设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性。

设计模式的分类

虽然设计模式只有23种,但是每一个设计模式都某一个可重复的设计问题提供了一套解决方案。根据他们的用途可以分为创建型,结构型和行为型三种。其中创建型模式主要用于描述如何创建对象,结构型模式主要用于描述如何实现类或对象的组合,行为型模式主要用于描述类或对象怎么交互以及怎么分配职责。在GoF23种设计模式中包含5种创建型设计模式,7种结构型设计模式和11种行为型设计模式。

创建型

1. 单例模式
2. 工厂方法模式
3. 抽象工厂模式
4. 原型模式
5. 建造者模式

结构型

1. 适配器模式
2. 桥接模式
3. 组合模式
4. 装饰模式
5. 外观模式
6. 享元模式
7. 代理模式

行为型

1. 职责链模式
2. 命令模式
3. 解释器模式
4. 迭代器模式
5. 中介者模式
6. 备忘录模式
7. 观察者模式
8. 状态模式
9. 策略模式
10. 模板方法模式
11. 访问者模式

设计模式的原则

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

单一职责原则是最简单的面向对象设计原则,他用于控制类的粒度大小。单一职责原则意思是说一个类只负责一个功能领域的事情,如果一个类承担的职责越多,那么他的可复用性就越小,耦合性也会变高,但其中一个职责发生变化时,很可能也会导致其他职责的变化。单一职责是实现高内聚,低耦合的指导方针。

开闭原则(Open-Closed Principle, OCP)

开闭原则是面向对象的可复用性设计的基石。开闭原则意思是对扩展开放,对修改关闭。即实体应该在不修改原有代码的基础上进行扩展。这个实体可以是一个模块,一个由多个类组成的局部结构或一个独立的类。抽象化是开闭原则的关键。

里氏代换原则(Liskov Substitution Principle,LSP)

里氏替换原则意思是所有引用基类(父类)的地方必须能透明地使用其子类对象。在软件中将一个基类对象替换成他的子类对象,程序将不会产生任何错误喝异常,但是反之则不可以,如果一个软件实体使用的是一个子类对象的话,那么他不一定能够使用基类对象。里氏替换原则是实现开闭原则的重要方式之一。

在使用里氏替换原则时需要注意一下几点:

  1. 子类的所有方法必须在父类中声明,或子类必须实现父类中声明的所有方法。根据里氏替换原则,为了保证系统的扩展性,在程序中通常使用父类来进行定义,如果一个方法只存在子类中,在父类中不提供相应的声明,则无法在以父类定义的对象中使用该方法。
  2. 在使用里氏替换原则时尽量把父类设计为抽象类或接口,让子类继承父类或实现父接口,并实现父类中声明的方法,在子类实例替换父类实例时就可以很方便的扩展系统的功能。

依赖倒转原则(Dependency Inversion Principle, DIP)

如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是面向对象设计的主要实现机制之一。依赖倒转原则意思是抽象不应该依赖于细节,细节应当依赖抽象,换言之,要针对接口编程,而不是针对实现编程。在实现依赖倒转原则时,我们需要针对抽象层编程,而将具体类的对象通过依赖注入的方式注入到其他对象中。

接口隔离原则(Interface Segregation Principle, ISP)

接口隔离原则意思是使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些他不需要的接口。当一个接口太大时,我们需要将他分割成一些更小的接口,使用该接口的客户端只需要知道与之相关的方法。每一个接口应该只承担相对独立的角色。

合成复用原则(Composite Reuse Principle, CRP)

复用原则意思是尽量使用对象组合,而不是继承来达到复用的目的。就是在一个新对象里通过关联关系来使用一些已有的对象,使之成为新对象的一部分,新对象通过委派调用已有对象的方法达到使用功能的目的。

在面向对象设计中,可以通过两种方法在复用已有的实现,一种是通过组合的关系,一种是继承。但是应该优先考虑使用组合的方式,这样可以降低类之间的耦合,一个类的变化对其他类造成的影响就相对较少,其次在考虑使用继承的方式,并且需要严格遵守里氏替换原则,有效使用继承会有助于问题解决,滥用继承反而会增加系统复杂度。

通过继承来复用的主要问题在于破坏系统的封装性,因为继承会将基类的实现暴露给子类,如果基类发生改变,那么子类的实现也不得不发生改变。

迪米特法则(Law of Demeter, LoD)

迪米特原则意思是一个实体应当尽可能少的与其他实体发生相互作用。如果一个系统符合迪米特原则,那么当其中某个模块发生改变时,就会尽量少的影响其他模块。该原则可以降低系统的耦合度。

相关内容

热门资讯

【看表情包学Linux】进程地...   🤣 爆笑教程 👉 《看表情包学Linux》👈 猛...
育碧GDC2018程序化大世界... 1.传统手动绘制森林的问题 采用手动绘制的方法的话,每次迭代地形都要手动再绘制森林。这...
编译原理陈火旺版第三章课后题答... 下面答案仅供参考! 1.编写一个对于 Pascal 源程序的预处理程序。该程序的作用是...
MacBookPro M2芯片... MacBookPro M2芯片下如何搭建React-Native环境目录软件下载环境配置 目录 写在...
Android studio ... 解决 Android studio 出现“The emulator process for AVD ...
pyflink学习笔记(六):... 在pyflink学习笔记(一)中简单介绍了table-sql的窗口函数,下面简单介绍下...
创建deployment 创建deployment服务编排-DeploymentDeployment工作负载均衡器介绍Depl...
gma 1.1.4 (2023... 新增   1、地图工具    a. 增加【GetWorldDEMDataSet】。提供了一套 GEO...
AI专业教您保姆级在暗影精灵8... 目录 一、Stable Diffusion介绍    二、Stable Diffusion环境搭建 ...
vue笔记 第一个Vue应用 Document{{content}}{{...
Unity自带类 --- Ti... 1.在Unity中,自己写的类(脚本)的名字不能与Unit...
托福口语21天——day5 发... 目录 一、连读纠音 二、语料输入+造句输出 三、真题 一、连读纠音 英语中的连读方式有好几种...
五、排序与分页 一、排序 1、语法 ORDER BY 字段 ASC | DESC ASC(ascen...
Linux系统中如何安装软件 文章目录一、rpm包安装方式步骤:二、deb包安装方式步骤:三、tar....
开荒手册4——Related ... 0 写在前面 最早读文献的时候,每每看到related work部分都会选择性的忽略&...
实验01:吃鸡蛋问题 1.实验目的: 通过实验理解算法的概念、算法的表示、算法的时间复杂度和空间复杂度分析&...
8个免费图片/照片压缩工具帮您... 继续查看一些最好的图像压缩工具,以提升用户体验和存储空间以及网站使用支持。 无数图像压...
Spring Cloud Al... 前言 本文小新为大家带来 Sentinel控制台规则配置 相关知识,具体内容包括流控...
多项目同时进行,如何做好进度管... 多项目同时进行,如何做好进度管理? 大多数时候,面对项目进...
ATTCK红队评估实战靶场(二... 前言 第二个靶机来喽,地址:vulunstack 环境配置 大喊一声我...