设计模式01-面向对象设计的几个基本原则

设计模式系列(01):总览与引导 本文为设计模式系列的开篇,旨在为读者提供设计模式的整体认知框架。文章首先介绍了设计模式的基本概念,强调其作为软件设计中反复出现问题的解决方案,能够提升系统的可维护性和可扩展性。接着,文章探讨了UML(统一建模语言)在设计模式中的应用,详细说明了UML图类型及其在表达设计模式结构中的作用。此外,文章还解释了面向对象设计中的关键术语,如聚合、组合、依赖等,并介绍了PlantUML工具的使用及其在UML建模中的优势。最后,文章概述了面向对象设计的六大原则(SOLID),并简要提及了设计模式的分类及其典型应用场景, 阅读详情
面向对象设计的几个基本原则

要考试了,一些面向对象设计的原则小结一下:

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

就一个类而言,应该仅有一个引起它变化的原因;

例子:手机的过多功能违反了单一职责原则;

如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏;

软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。要去判断是否应该分离出类来,也不难,那就是如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责,就应该考虑类的职责分离;

【例子:调制解调器类】

完成两个职责:建立/中断连接、发送/接收数据。

问题:如果应用程序会改变数据连接方式,而必须修改Modem类,使任何依赖Modem类的元素都要重新编译,包括不用到连接功能的应用。

解决办法:重构Modem类,建立两个接口,一个专门负责连接、另一个专门负责数据发送。依赖Modem类的元素根据职责的不同分别依赖不同的接口。

最后由ModemImplementation类实现这两个接口。

使用SRP注意点:

1、 SRP实质上规定了类的粒度划分 ;

2、如果职责没有变化的征兆,则不应用SRP;

3、如果程序总是要求两个职责同时变化,也不必分离职责;

5、职责分离后,可以用Facade或Proxy模式对外提供一个聚合的操作接口 ;

优点/作用:

有助于理清思路。

使我们的编码、测试和维护变得简单。

有助于代码的重用。

有助于系统的扩展。

过度的分离会导致不必要的复杂性;


开放-封闭原则

软件实体(类、模块、函数等)应该可以扩展,但是不可修改。该原则有两个特征,一个是"对于扩展是开放的(open for extension)",另一个是"对于更改是封闭的(closed for modification)";

变化不太好预测,但在变化发生时,就要立即创建抽象来隔离以后发生的同类变化;

开放-封闭原则的精神——面对需求,对程序的改动是通过增加新代码(扩展原有的类)来进行的,而不是更改现有的代码;

[开闭原则应用例子]:

将条件转移语句改写成为多态性的代码重构

条件转移语句——某种可变性。

将条件转移的商业逻辑封装到不同的具体子类中。

用多态性代替条件转移语句。

一个引申的问题:多态性的滥用——”多态性污染“

任何语言都提供条件转移功能。

使用多态性代替条件转移意味着创建大量的类。

一个类如果有M个方法,每个方法都有一个N段的条件转移语句。如果都用多态性代替,会造成M*N个不同的类。

无原则改写条件转移语句为多态性是一种没有意义的浪费。

何时使用重构做法:

条件转移语句确实封装了商务逻辑的可变性

条件转移语句随着时间在变化——需要改变

需要扩展——有意义的可变性

拒绝不成熟的抽象和抽象本身一样重要!


依赖倒转原则

表述一:应该让框架调用你的代码,而不要由你主动调用框架本身。

表述二:抽象不应依赖于细节,细节应当依赖于抽象。

表述三:要针对接口编程,不要针对实现编程。

抽象可以理解成电脑主板上的一个个插槽,细节则是CPU、内存、硬盘等部件的工作原理;

高层模块(电脑部件)不应该依赖低层模块(主板),两个都应该依赖抽象(主板插槽);

依赖倒转原则很经典,可以说是面向对象设计的标志!

依赖倒转原则的实现是建立在里氏代换原则之上的。

优点:

不必知道对象的类型,只要求对象遵守接口。不必知道对象的类,只需知道定义接口的抽象类。——降低了子系统间的实现依赖。

依赖倒转关系强调了系统内的实体之间关系的灵话性。从具体耦合变为抽象耦合。

三种耦合关系:

零耦合:两个类没有耦合关系。

抽象耦合:耦合发生在一个具体类和一个抽象类之间,两个必须发生关系的类之间存有最大的灵活性。

具体耦合;耦合发生在两个具体的(可实例化的)类之间,一个类直接引用另一个具体类。


运用依赖倒转原则时可能碰到的问题:

创建对象要避免对具体类的直接引用,有时需要创建抽象类。

会导致大量的类。维护难度大。

倒转原则假定所有的具体类都是会变化的,不排除有一些具体类相当稳定。


里氏代换原则

一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别。

也就是说,在软件里面,把父类都替换成它的子类,程序的行为没有变化,简单地说,子类型必须能够替换掉它们的父类型;

正因为有了这个原则,使得继承利用成为了可能,只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为;

由于子类型的可替换性才使得使用父类类型的模块在无需修改的情况下就可以扩展。

[例]:假设有两个类: Base 类,Derived类,且 Derived 类是 Base类的子类。

一个方法如果可以接受一个基类对象 b 的话: method (b),那么它必然可以接受一个子类对象 d ,也可以有method (d)。

反过来的代换不成立,即如果一个软件实体使用的是一个子类的话,那么它不一定适用于基类。

里氏代换原则是继承复用的基石,是对“开—闭”原则的补充,是对实现抽象化的具体步骤的规范,里氏代换原则是开—闭原则的必要条件。

一般而言,违反里氏代换原则的,也违背“开—闭”原则,反过来不一定成立。

只有当衍生类可以替换掉基类,软件单位的功能不会受到影响时,基类才能真正被复用。而衍生类也才能够在基类的基础上增加新的行为。


迪米特法则

又称最少知识原则,最初是用来作为面向对象的系统设计风格的一种法则,

一个对象应当对其他对象有尽可能少的了解。

迪米特法则表述:

表述一:只与你直接的朋友们通信

表述二:不要跟“陌生人”说话

表述三:每一个软件单元对其他的单元都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。

“直接”、“陌生”和“密切”——模糊化的概念,以便在不同的环境下可以有不同的解释。

 

狭义的迪米特法则:

如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互调用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

调用转发( Call Forwarding)

隐藏‘’陌生人”的存在,使得“某人”仅知道“朋友”,而不知道’‘陌生人”。认为所调用的这个方法是“朋友”的方法。

朋友条件:

当前对象本身

以参量形式传入当前对象方法中的对象

当前对象的实例变量直接引用的对象

当前对象的实例变量如果是一个聚集,聚集中的元素都是朋友


接口隔离原则(ISP,Interfacesegregation Principle )

面向对象的设计的一个重要内容:准确而恰当地划分角色以及角色所对应的接口。

“接口”:一个类所提供的所有方法的特征集合的逻辑概念。

接口的划分直接影响类型的划分。

接口→剧本中的角色;接口实现→相当于演员。

接口隔离原则=角色隔离原则:每一个角色都应当由一个特定的接口代表。

表述一:一个类对另一个类的依赖性应当建立在最小的接口上。

    如果系统涉及到多个角色的话,一个接口在它的整个生命周期中都只应当代表一个角色,实现一个接口对象。几个不同的角色不应当都交给同一个接口,而应当交给不同的接口。

表述二:使用多个专门的接口比使用单个的总接口要好。

表述三:为同一个角色不同的客户端,提供宽、窄不同的接口,叫做定制服务。

接口污染:过于臃肿的接口

一个没有经验的设计师往往想节省接口的数目,将差不多的接口合并,认为是代码优化,这是错误的。将没有关系的接口合并在一起,是对角色和接口的污染。

和模块化原则的关系:模块的功能内聚。

SRP:将一个具备强大功能的类分割成多个小类,每个小类仅提供某个单一的功能。

ISP:如果设计一个类提供给多个客户调用,则类中某些方法对某些客户是无用的,这会造成客户对方法的错误调用。通过划分接口让每个客户只使用其特定的接口而不是一个类实例,可以避免此类错误。



多用组合少用继承原则

为什么说多用组合,少用继承?
对类的功能的扩展,要多用组合,少用继承。
对于类的扩展,在面向对象的编程过程中,我们首先想到的是类的继承,由子类继承父类,从而完成了对子类功能的扩展。但是,面向对象的原则告诉我们,对类的功能的扩展要多用组合,而少用继承。其中的原因有以下几点:
第一、子类对父类的继承是全部的公有和受保护的继承,这使得子类可能继承了对子类无用甚至有害的父类的方法。换句话说,子类只希望继承父类的一部分方法,怎么办?
第二、实际的对象千变万化,如果每一类的对象都有他们自己的类,尽管这些类都继承了他们的父类,但有些时候还是会造成类的无限膨胀。
第三、 继承的子类,实际上需要编译期确定下来,这满足不了需要在运行内才能确定对象的情况。而组合却可以比继承灵活得多,可以在运行期才决定某个对象。


面向对象设计的基本原则和实践建议 面向对象的设计基本原则以及实践建议,不妨看看 立即下载

相关推荐

Ubuntu20.04复现instant-ngp,自建数据集,导出mesh

本次仅仅记录一下自己复现instant-ngp的过程,如果里面的参考有冒犯到原博主请联系我删除,本人也是nerf的小白一枚,可以一起交流学习神经辐射场,希望大家在复现instant-ngp的时候少走一些坑,情况允许下可以去复现一下npg-pl和nerfStudio,最后希望大家一起进步。看到一些博主说葵司的npg_pl也不错,而且葵司是台湾人,在youtube上也有讲解的视频。渲染的效果还是可以的,相对于源码来说还是有点模糊,我一些参数也没有设置,直接就拉进来进行渲染,速度是非常快的。

weixin_59961223的博客 9451

面向对象设计原则

一、“开-闭”原则(Open-Closed Principle,OCP) 1.1“开-闭”原则的定义及优点 1)定义:一个软件实体应当对扩展开放,对修改关闭( Software entities should be open for extension,but closed for modification.)。即在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。 2)满足“开-闭”原则的系统的优点 a)通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求,使变化中的软件系

桀骜浮沉的博客 371

RK3588芯片CAN总线调试秘籍:SocketCAN与错误帧攻略

RK3588芯片在嵌入式领域凭借8nm工艺和强大性能成为核心控制器。本文详细介绍了其CAN总线配置流程,包括硬件连接、内核驱动配置及SocketCAN命令操作,并深入解析了CAN通信中的错误帧机制及分析方法。通过智能工厂案例,展示了从问题定位到解决方案的全过程,强调了稳定通信对工业应用的重要性。文章为RK3588的CAN总线应用提供了实用技术参考,并对未来智能诊断技术在该领域的应用进行了展望。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 516

设计原则之开闭原则(一)

    开闭原则是设计原则基础的基础,其它原则均围绕开闭原则进行展开。开闭原则也就是一个软件实体应当对扩展开放,但对修改关闭。满足了开闭原则的设计,我们的系统将达到在设计稳定的基础上,方便的对软件进行扩展,插入新的功能模块的目的。       怎么样做的开闭原则呢?抽象化是关键,也是我们经常听到的“面象接口编程”,具体一点就是声明的变量的类型、函数的参数类型、函数的返回类型等要尽量使用抽象类和

小马亦识途 1272

Autosar诊断实战系列07-Dcm之0x19 06扩展数据配置及工程问题讨论

19 06扩展数据如何配置?如果某DTC没有出现过故障扩展数据该如何响应?

initiallizer的博客 1704

【目标检测】基于yolov5的水下垃圾检测(附代码和数据集,7684张图片)

【目标检测】基于yolov5的水下垃圾检测(附代码和数据集)

学无止境、积少成多、厚积薄发 4183

“开-闭”原则 (Open-Closed principle, OCP)

“开-闭”原则 (Open-Closed principle, OCP) 一个软件实体应当对扩展开放,对修改关闭。Software entities should be open for extension, but closed for modification.在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。 “可变性的封装原则”从工程的角度讲解了

moon1128的专栏 9870

Win7/10/11文件拖拽导致资源管理器闪退问题

最近老是遇到把文件从资源管理器拖动到微信或者浏览器时,资源管理器直接闪退的问题,一开始在公司遇到了还以为是电脑配置太低,直到被封闭在家办公,发现自己的高级电脑也有这个问题,那就来了解了解问题是出在什么地方把。

Nicer_feng's blog 1万+

01、设计模式之简介及面向对象的几个基本原则

1、设计模式:从许多优秀的软件系统中总结出成功的可复用的设计方案。 2、抽象类作为上转型对象:抽象类不能用new运算符创建对象,但其非abstract子类必须重写全部的abstract方法,这样一来,就可以让抽象类声明的对象成为其子类对象的上转型对象,并且调用子类重写的方法。 如A是抽象类,有抽象方法add(),B继承A并且实现里面的抽象方法,则A a=new B();a.add();可以

虚心求学_一点一滴 1014

从 RAP OData 到可交付的 SAP Fiori 应用:部署与授权全链路实战笔记

摘要:本文探讨了RAP开发中常见的交付误区,指出开发者预览(FEAP)并非可部署应用,强调从服务发布到业务应用落地的完整链路。文章详细对比了不同部署路径(ABAP/BTP),解析权限管理关键点(SAP_BR_DEVELOPER的临时性),并提供了标准授权组合方案(IAM+业务目录+角色)。通过"发运跟踪"案例,展示了从开发验证到生产部署的全流程,特别提醒注意开发环境与生产环境的权限差异,避免"开发机正常、生产机403"的典型问题。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1401

华为OD机试真题 新系统 9月20号 【字符串分组求和】

华为OD新系统机试真题【字符串分组求和】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【字符串分组求和】解析。

qq_45776114的博客 624

【C#面向对象设计模式】01. 面向对象设计模式与原则

只需要在新的文件里增添新的员工类,让其继承自Employee抽象类,并重写GetSalary()方法,然后在EmployeeFactory.GetEmployee方法中根据相关条件,产生新的员工类型就可以了。使用面向对象编程语言,可以推动程序员以面向对象的思维来思考软件设计结构,从而强化面向对象的编程范式。随着客户公司业务规模的拓展,又出现了更多类型的公司,比如钟点工、计件工……我们需要设计一个人事管理系统,其中的一个功能是对各种不同类型的员工,计算其当月的工资——不同类型的员工,拥有不同的薪金计算制度。

Cziii的博客 698

【零基础学习CAPL】——CAN报文的发送(CRC——ChecSum值)

本章主要介绍带有CRC值的报文发送一般报文可使用CANoe的IG模块直接发送,但带有CRC值的报文就只能编写脚本进行发送,以下详细讲解在配合Panel面板情况下,如何进行带有循环冗余码的报文进行报文的发送。

LOVE135149的博客 1913

设计模式——类与对象设计的六大基本原则

本文介绍了设计模式中的六大基本原则:单一职责原则、开放封闭原则、子类替换父类原则、接口调用原则、类对象交互原则和接口隔离原则。通过具体代码示例,阐述了每个原则的核心思想和应用场景,旨在提高代码的可维护性和灵活性。

庄小焱 6191

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

23种设计模式全解析

一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式

19万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

设计模式(01)设计模式基本原则与分类

作为面向对象编程的5个原则。当这些原则被应用时,它们使得整个软件变得清晰、简单且最大限度的拥抱变化。典型地应用在测试驱动开发,敏捷开发 以及 自适应软件开发基本原则的重要组成部分。最后,以上几个原则总结为几个关键词:抽象、单一、最小化。@2 软件设计:开发工作(少)+拥抱变化(关注后续升级+维护,多)

wangdsh的博客 647

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java实验 10  面向对象的几个基本原则

实验10面向对象的几个基本原则 楼房的窗户 相关知识点 所谓面向抽象类编程,是指设计一个类时,不让该类面向具体的类,而是面向抽象类或者接口。“开-闭”原则就是让设计的系统应该对外扩展开放,对修改关闭。其本质是指当系统中增加新的模块时,不需要修改现有的模块。在设计系统时,应当首先考虑到用户需求的变化,将应对用户变化的部分设计为扩展开放,而设计的核心部分是经过精心考虑之后确定下来的基本结构,这部分应当对修改关闭的,即不能因为用户的需求变化而再发生变化,因为这部分不是用来应对需求变化的。 设计某些系统...

吹灭读书灯 一身都是月的博客 1566

从零开始设计模式01六大原则

为什么学习设计模式的六大原则,举个例子Spring设计的思想与设计模式原则高度契合,我们可以根据这些原理来评判自己在代码实现的时候有没有可能让程序更灵活可扩展,有助于我们写出代码模块化并且结构合理的程序。如果对每一个类型为T1的对象o1,都存在类型为T2的对象o2,使得在对象o1出现的地方都可以用对象o2代替,而程序的行为不变,那么类型T2是类型T1的子类型。小而专用的接口:设计小的、专用的接口,使得每个接口只包含特定的功能,而不是一个庞大的多功能接口。组合:将不同的对象组合在一起,以实现所需的功能。

azyouyouyou的博客 1245

设计模式——设计模式简介和七大原则

设计模式的目的和核心原则、单一职责原则、接口隔离原则、依赖倒转原则、里氏替换原则、开闭原则、迪米特法则、合成复用原则

种一棵树最好的时间是十年前,其次是现在 2631

设计模式:01-设计模式的来源和原则

设计模式是软件开发中针对常见问题的解决方案,可提高代码的可复用性、可维护性和安全性。本文介绍了六大设计原则:1)单一职责原则,要求类只负责一个功能;2)开闭原则,提倡对扩展开放对修改关闭;3)里氏替换原则,确保子类可替代父类;4)依赖倒置原则,高层和低层模块都应依赖抽象;5)迪米特原则,减少对象间的耦合;6)接口隔离原则,客户端不应依赖不需要的接口。这些原则有助于构建高内聚、低耦合的健壮系统。

MANCXUARY的博客 648

设计模式01--设计模式七大原则

设计模式七大原则

Bee_Darker的博客 1342

C++设计模式 | 概述及面向对象设计原则

概述 设计模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案。 软件设计模式的种类: 创建型(Creational)模式: 如何创建对象; 结构型(Structural )模式: 如何实现类或对象的组合; 行为型(Behavioral)模式: 类或对象怎样交互以及怎样分配职责。 设计模式目前种类: GoF的23种 + “简单工厂模式” = 24种。 学习设计模...

weixin_41017788的博客 379

决战设计模式01——设计模式概论

决战设计模式01——设计模式概论

weixin_42826353的博客 1915

java—01 设计模式&设计原则(I)

研发 --> 架构 (定义、例子,框架或接口中用过相关的开发)Single Reposibility Principle定义:一个类或者模块/服务/架构只负责完成一个职责。电商拆分成订单、库存、物流、支付。LSP:Liskov Substitution Principle定义:多用组合,少用继承。(在自己的类里引用其他的类(new一个类))含义:(1)里氏替换原则是针对继承而言的,如果继承是为了实现代码重用,也就是为了共享方法,那么共享的父类方法就应该保持不变,不能被子类重新定义。子类只能通过新添加方法来

QiAn的博客 1504

0x01 设计模式之设计原则

设计模式是软件开发过程中一些常见问题的典型,而非具体的解决步骤(算法),可以理解为软件开发的套路(通常是面向对象编程的软件设计模式)。

1ncludeSteven 458
上一篇: Mac下MySQL卸载方法
下一篇: 设计模式02-抽象工厂模式
kingmicrosoft
博客等级 码龄14年 32粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值