设计模式 —— 设计模式三大分类与六大原则

利用DRONEKIT-SITL + MAVPROXY + QGroundControl模拟飞行 dronekit: 一种用于无人机控制的python库。 dronekit-sitl:一种本地仿真工具,相当于本地虚拟化了一个无人机。 mavproxy:数据转发软件(类似于插线板的感觉,一个输入,多个相同的输出)。打开一个Anaconda prompt 首先激活相应的环境 然后运行如下命令: 保持2中的Anaconda prompt处于运行状态,另打开一个Anaconda prompt窗口,运行如下命令: tcp:127.0.0.1:5760: SITL默认端口,作为mavproxy的输入,把输入数据转发 阅读详情

0. 前言

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。

使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。

项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。


0.1 UML图

统一建模语言(Unified Modeling Language,UML)

详见之前一篇文章UML类图


1. 设计模式的三大分类

共有23种设计模式,可以分为3类:

  • 创建型(Creational):
  • 结构型(Structural):
  • 行为型(Behavioral):

(1) 创建型(5种)

  • 工厂方法模式(Factory Method) 重要程度:5
  • 抽象工厂模式(Abstract Factory) 重要程度:5
  • 简单工厂模式(Simple Factory) 重要程度:4 (后来添加的)
  • 单例模式(Singleton) 重要程度:4
  • 原型模式(Prototype) 重要程度:3
  • 建造者模式(Builder) 重要程度:2
(2) 结构型(7种)
  • 外观模式(Facade) 重要程度:5
  • 适配器模式(Adapter) 重要程度:4
  • 组合模式(Composite) 重要程度:4
  • 代理模式(Proxy) 重要程度:4
  • 装饰模式(Decorator) 重要程度:3
  • 桥接模式(Bridge) 重要程度:3
  • 享元模式(Flyweight) 重要程度:1
(3) 行为型(11种)
  • 观察者模式(Observer) 重要程度:5
  • 迭代器模式(Iterator) 重要程度:5
  • 命令模式(Command) 重要程度:4
  • 策略模式(Stragety) 重要程度:4
  • 责任链模式(Chain of Responsibility) 重要程度:3
  • 状态模式(State) 重要程度:3
  • 模板方法模式(Template Method) 重要程度:3
  • 中介者模式(Mediator) 重要程度:2
  • 备忘录模式(Memento) 重要程度:2
  • 解释器模式(Interpreter) 重要程度:1
  • 访问者模式(Visitor) 重要程度:1
2. 设计模式的六大原则
(1) 单一职责原则(Single Responsibility Principle, SRP)
定义:就一个类而言,应该有且仅有一个引起它变化的原因。
简单来说:一个类中应该是一组相关性很高的函数、数据的封装。
好处:类的复杂度降低、可读性提高、可维护性提高、扩展性提高、降低了变化引起的风险。
需要注意:单一职责的划分界限并不总是那么清晰,如何划分一个类、一个函数的职责,需要根据个人经验、具体的业务逻辑而定。

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

定义:所有引用基类的地方必须能透明地使用其子类的对象。

通俗地讲:只要父类能出现的地方子类就能出现,而且替换为子类也不会产生任何错误或异常。反之就不行了,有子类出现的地方,父类未必就能适应。

好处:增强程序的健壮性,即使增加了子类,原有的子类还可以继续运行。

需要注意:如果子类不能完整地实现父类的方法,或者父类的某些方法在子类中已经发生“畸变”,则建议断开父子继承关系 采用依赖、聚合、组合等关系代替继承。


(3) 依赖倒置原则(Dependence Inversion Principle, DIP)

定义:高层模块不应该依赖底层模块,两者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。

通俗地讲:模块间的依赖通过抽象产生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的。

好处:扩展性提高、解耦

需要注意:依赖倒置原则指代了一种特定的解耦形式,使得高层次的模块不依赖与低层次的模块的实现细节的目的。


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

定义:类之间的依赖关系应该建立在最小的接口上。

通俗地讲:建立单一接口,不要建立庞大臃肿的接口;尽量细化接口,接口中的方法尽量少。

也就是说,我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。

需要注意:

  • 接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性,但是如果过小,则会造成接口数量过多,使设计复杂化,所以一定要适度。
  • 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。
  • 为依赖接口的类定制服务。只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。

(5) 迪米特定律(Law of Demeter, LoD)

也称为最少知识原则(Least Knowledge Principle)

定义:一个对象应该对其他对象有最少的了解。

通俗地讲:一个类应该对自己依赖的类知道得越少越好。

自从我们接触编程开始,就知道了软件编程的总的原则:低耦合,高内聚。

无论是面向过程编程还是面向对象编程,只有使各个模块之间的耦合尽量的低,才能提高代码的复用率。

低耦合的优点不言而喻,但是怎么样编程才能做到低耦合呢?那正是迪米特法则要去完成的。


(6) 开闭原则(Open Close Principle, OCP)

定义:软件中的对象(类、模块、函数等)应该对于扩展是开放的,但是,对于修改是封闭的。

通俗地讲:在软件的生命周期内,变化(升级和维护等)一定会发生。当软件需要变化时,应该尽量通过扩展的方式来实现变化,而不是通过修改已有的代码来实现。

然而,在实际的开发过程中,修改原有代码、扩展代码往往是同时存在的。

【STM32开源实战】基于STM32的智能输液监控系统设计实现 本文详细介绍了基于STM32F103C8T6主控芯片的智能输液监控系统设计实现。该系统通过光学液位传感器、温度传感器和红外滴速检测模块实时监测输液状态,利用步进电机自动调节滴速,并通过蓝牙实现数据远程传输,为医院提供了一套低成本、高可靠性的智能输液解决方案。 阅读详情

相关推荐

「 网络安全常用术语解读 」软件成分分析SCA详解:从发展背景到技术原理再到业界常用检测工具推荐

软件成分分析(Software Composition Analysis,SCA)是一种用于识别和分析软件内部组件及其关系的技术,旨在帮助开发人员更好地了解和管理其软件的构建过程,同时可帮助安全人员揭秘软件内部结构的神秘面纱。SCA技术的发展软件行业的快速发展密不可分,下面将介绍SCA的发展背景、技术原理以及当前主流SCA工具。

所有成功的背后,都是痛苦的坚持,所有的痛苦,都是傻瓜般的不放弃! 5554

设计模式原则

关于这个原理的应用其实也很常见,比如在 Qt 中,所有窗口类型的类的构造函数都有一个 QWidget* 类型的参数(QWidget 类是所有窗口的基类),通过这个参数指定当前窗口的父对象。,在 C++ 中就是将其放到一个抽象类中(C++ 中没有接口,不能像 Java 一样封装成接口),每个细节就相当于上面例子中的哺乳动物的一个特性,这样一来这个抽象的哺乳动物类就成了项目架构中高层和低层的桥梁,将二者整合到一起。设计模式中所谓的单一职责原则,就是对一个类而言,应该仅有一个引起它变化的原因,其实就是将这个。

m0_63736943的博客 1107

099、多摄融合变焦系统:广角到长焦的无缝切换算法

本文分享了多摄融合变焦系统开发中的实战经验和关键挑战。作者通过一个旗舰机项目案例,揭示了广角到长焦切换时画面抖动问题的根源——融合算法误将视差当作运动补偿,并提出"视差冻结窗口"的解决方案。文章总结了三大多摄融合难点:物理视差处理、亮度差异补偿和切换时机把控,详细阐述了分层架构设计、融合权重计算等核心技术。同时强调了产线校准的重要性,并给出五项实用建议:允许边缘鬼影保留、参数场景化配置、加强产线检测、完善调试接口,以及合理运用AI技术。全文展现了多摄融合技术在时间、空间和感知维度上的复杂平衡艺术。

sundong_81的博客 17

设计模式——设计模式三大分类以及六大原则

通俗的讲,一个类对自己需要耦合的类应该知道的最少,你内部多么复杂和我没关系,我只对你提供的public方法感兴趣。这样的话,如果一个系统符合迪米特法则,那么当其中某一个类发生修改时,就会尽量少地影响其他模块,降低系统的耦合度,使类类之间保持松散的耦合关系。比如在Activity中存在网络请求的逻辑,导致Activity过于臃肿,导致引起这个Activity变化的原因太多,这样就违反了单一职责原则,不利于后续的版本维护。这种设计也充分说明了,类类不应该直接依赖细节,因为这样会导致耦合,限制了可扩展性,

technologyleader的专栏 1922

设计模式设计原则

程序设计的要遵循的一些理论,也可以理解为程序设计的一种要求和目标,是面向对象程序设计的基石,也是面向对象程序设计的质量保障和依据。

Jeremy321321的博客 1383

设计模式(1)——设计模式的七大原则三大模式

一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。模块应该尽量在不修改原代码的情况下进行扩展。在软件周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给代码引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试。当软件需求变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有代码来实现变化。开放封闭原则是面向对象设计的核心所在,遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。...

weixin_48560325的博客 915

设计模式二之原则分类

1. 设计模式六大原则: 开闭原则 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类。 里氏替换原则 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的...

pizicai007的博客 156

设计模式概览

设计模式概览一、设计模式分类二、设计模式六大准则三、Java中的23种设计模式 一、设计模式分类 总的来说设计模式分为3大类 创建型模式(5种):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式 结构型模式(7种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式 行为型模式(11种):状态模式、策略模式、访问者模式、迭代器模式、命令模式、观察者模式、中介...

MuskMelon 1283

小滴课堂-学习笔记:(2)想成为架构师的你,不可不知道的设计模式精髓

愿景:"让编程不再难学,让技术生活更加有趣" 更多架构课程请访问 xdclass.net 目录 第1集 设计模式六大原则你知道多少 第2集 大佬们常说的设计模式到底是什么 第3集 多个业务场景浏览-设计模式使用前后的区别 干货文档 第1集 设计模式六大原则你知道多少 简介:讲解设计模式六大设计原则 设计模式是站在设计原则的基础之上的,所以在学习设计模式之前,有必要对这些设计原则先做一下了解 软件设计开发原则 为了让的代码更好重用性,可读性,可靠性,可维护性..

dev666的博客 267

Android/Java设计模式深入剖析

参考链接: https://blog.csdn.net/cdl2008sky/article/details/3335385 http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html

虎哥LoveDroid 414

java设计模式原则

GOF:四人组(Gang of Four) 《 Design Patterns》一书讨论了 23 种不同的范式,并依据三个标准分类(所有标准都涉及那些可能发生变 化的方面)。这三个标准是: (1) 创建:对象的创建方式。这通常涉及对象创建细节的隔离,这样便不必依赖具体类型的对象,所以在新 添一种对象类型时也不必改动代码。 (2) 结构:设计对象,满足特定的项目限制。这涉及对象其他对象的

cool的博客 384

java设计模式

1.设计模式三大分类 设计模式分为三大类: 创建型模式:对象实例化的模式,创建型模式用于解耦对象的实例化过程。 结构型模式:通过对多个类和对象进行组合得到复杂结构的类,一般使用继承或者成员变量引用形式来实现。 行为型模式:行为模式不仅表达了对象和类,还表达了他们之间的交互,涉及到了对象和算法的分配。 每种设计模式类型包含的设计模式: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例...

败毒的博客 255

设计模式之介绍

本人做技术也做了快两年了,实现功能模块的个人基本也可以独立完成,但是感觉对项目的整体设计并没有一个很好的学习,在这里总结一下。 我估计我也记不住所有的,常用的会用,能画模块UMI图是我的目标。 接下来的 学习设计模式,demo和概念代码会从网上找 我也会给上标注,但对于每个设计模式我会写出我...

chuanyanban5120的博客 103

设计模式分类原则

设计模式分类原则 一、设计模式分类 创建型:创建对象的模式 结构型:讨论类和对象的结构 行为型:关注对象的行为,解决对象之间的联系问题。 二、设计原则 2.1 单一职责原则 只有一个引起它变化的原因,一个类只有一个职责。 2.2 里氏替换原则 父类能出现的地方能用子类替换,但是反过来不一定可以。 2.3 依赖倒置原则 面向接口编程的精髓。 ...

weixin_30410999的博客 85

JAVA设计模式(一)

一些关于设计模式的总结,我只是各个网站资料的搬运工。。。。 设计模式(一)设计模式分类创建型模式结构型模式行为型模式设计模式六大原则原则:开闭原则(Open Close Principle)1、单一职责原则2、里氏替换原则(Liskov Substitution Principle)3、依赖倒转原则(Dependence Inversion Principle)4、接口隔离原则(Interface Segregation Principle)5、迪米特法则(最少知道原则)(Demeter Princip

qq_27925949的博客 748

【软考-系统架构设计师】设计模式三大类型解析

创建模式,结构模式,行为模式

王子期的博客 1593

23种设计模式设计模式的特点和分类

转载地址:https://sscloud.net/solution/jsp/article.jsp?articleId=10083 一、创建型模式 创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成。就像我们去商场购买商品时,不需要知道商品是怎么生产出来一样,因为它们由专门...

2449

大话设计模式1:初识设计模式设计模式五大基本原则

一什么是设计模式?        设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计 模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多 赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。        二为什么要使用设计模式?  

life is wonderful 5789

pytorch实现基于LSTM的高速公路车辆轨迹预测源码+数据集+项目说明.zip

pytorch实现基于LSTM的高速公路车辆轨迹预测源码+数据集.zip 第1步:轨迹数据滤波,将原始US101和I-80的原始数据放入下图文件夹,运行代码"trajectory_denoise.py",结果如下:image第2步:移除不必要特征以及添加新特征,运行代码"preprocess.py",结果如下:image第3步:根据需要添加横、纵向速度和加速度特征,运行代码"add_v_a.py",结果如下:image第4步:按照滑动窗口法提取所需8s轨迹序列,运行代码"final_DP.py",结果如下:image第5步:最终合并US101和I-80数据集,为保证数据的均衡性以及充分利用数据集,随机采样10组数据集,每组按照6:2:2的比例划分训练集、测试集和验证集;运行代码"merge_data.py".模型训练及测试MTF-LSTM模型训练,运行代码"MTF-LSTM.py"MTF-LSTM-SP模型训练,运行代码"MTF-LSTM-SP.py"本文训练好的MTF-LSTM和MTF-LSTM-SP模型保存在文件夹/algorithm

MEMZ 源码大全 - 副本_C++_memz源代码_MEMZ下载_MEMZ_memz源码_源码

memz源码,请勿直接编译运行,仅供参考!!!!!

上一篇: Java技术 —— final关键字
下一篇: 计算机网络 —— TCP/IP四层模型与OSI七层模型
waynelu92
博客等级 码龄11年 15粉丝 24原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值