面向对象设计模式与原则0

Android源码设计模式探索与实战【面向对象六大基本原则】 IT行业,一直讲一句话,拼到最后都拼的是“内功”,而内功往往就是指我们处理问题的思路、经验、想法,而对于开发者来说,甚至对于产品也一样,都离不开一个“宝典”,就是设计模式。今天我们一起借助Android源码去探索一下设计的六大基本原则。同时结合我工作经验中的两个例子,来总结实践一下。 1.背景&定义 定义: 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 理解: 设计模式是什么?设计模式(Desi. 阅读详情

面向对象设计模式与原则0

1.设计模式简介:

wKioL1U-WNmTUINBAACmEZbS9jc247.jpg

每一个模式描述胃一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。 -----Christopher Alexander

设计模式描述胃软件设计过程中某一类常见问题的一般性的解决方案。

面向对象设计模式描述了面向对象设计过程中、特定场景下、类与相互通信胡对象之间常见胡组织关系。

2.GoF 23种设计模式

历史性性著作《设计模式:可复用面向对象软件的基础》一书中描述了23种经典面向对象设计模式,创立了模式在软件设计中的地位。该书四位作者被人们并称为Gang of Four (GoF),“四人组”,该书描述的23种经典设计模式又被人们称为GoF 23种设计模式。

由于《设计模式:可复用面向对象软件的基础》一书确定了设计模式的地位,人们通常所说胡设计模式隐含胡表示“面向对象设计模式”。但这并不意味着“设计模式”就等于“面向对象设计模式”,也不意味着GoF23种模式就表示了所有的“面向对象设计模式”。除了“面向对象设计模式”外,还有其他设计模式。除了GoF23种设计模式外,还有更多的面向对象设计模式。

GoF 23种设计模式是学习面向对象设计模式的起点,而非终点;本系列的学习目的是让我们在建立在有效方法的基础上,掌握GoF 23种设计模式。

3.设计模式与面向对象

面向对象设计模式解决胡是:类与相互通信的对象之间的组织关系,包括它们的角色、职责、协作方式几个方面。

面向对象设计模式是“好的面向对象设计”,所谓“好的面向对象设计”是那些可以满足“应对变化,提高复用”的设计。

面向对象设计模式描述的是软件设计,因此它是独立于编程语言的,但是面向对象设计模式的最终实现仍然需要使用面向对象编程语言来表达,本课基于C#语言,但实际上它适用于支持.NET框架的所有.NET语言,如Visual Basic.NET、C++/CLI等。

面向对象设计模式不像算法技巧,可以照办照用,它是建立在“面向对象”纯熟、深入的立即的基础上的经验性认识。掌握面向对象设计模式的前提是首先掌握“面向对象”!

4.从编程语言直观了解面向对象

各种面向对象编程语言相互有别,但都能看到它们对面向对象三大机制的支持,即:“封装、继承、多态”

    --封装:隐藏内部实现;

    --继承:复用现有代码;

    --多态:改写对象行为;

使用面向对象语言(如C#),可以推动程序员以面向对象的思维来思考软件设计结构,从而强化面向对象的编程范式。

C#是一门支持面向对象编程的优秀语言,包括:各种级别的封装支持;单实现继承+多接口实现;抽象方法与虚方法重写。

5.但OOPL并非面向对象的全部

通过面向对象编程语言(OOPL)认识到的面向对象,并不是面向对象的全部,甚至只是浅陋的面向对象。

OOPL的三大机制“封装、继承、多态”可以表达面向对象的所有概念,但这三大机制本身并没有河刻画出面向对象的核心精神。换言之,既可以用这三大机制做出“好的面向对象设计”,也可以用这三大机制做出“差的面向对象设计”。不是使用了面向对象的语言(例如C#),就实现了面向对象的设计与开发!因此我们不能依赖编程语言的面向对象机制,来掌握面向对象。

OOPL没有回答面向对象的根本性问题---我们为什么要使用面向对象?我们应该怎样使用三大机制来实现“好的面向对象”?我们应该遵循什么样的面向对象原则?

任何一个严肃的面向对象程序员,都需要系统的学习面向对象的知识,单纯从编程语言上获取的面向对象知识,不能够胜任面向对象设计与开发。

6.从一个示例谈起

示例场景:

我们需要设计一个人事管理系统,其中一个功能是对各种不同类型的员工,计算其当月的工资---不同类型的员工,拥有不同的薪金计算机制。

机构化做法:

获得人事系统中所有可能的员工类型;

根据不同的员工类型所对应的不同薪金制度,计算其工资;

enum EmployeeType{    Engineer;    Sales;    Manager;    ...}//计算工资程序if(type==EmployeeType.Engineer){    ......}else if(type==EmployeeType.Sales){    ......}

面向对象设计

根据不同的员工类型设计不同的类,并使用这些类继承自一个Employee抽象类,其中有一个抽象方法GetSalary。

在各个不同的员工类中,根据自己的薪金制度,重写(override)GetSalary方法。

abstract class Employee{    ...    public abstract int GetSalary();}class Engineer:Employee{    ...    public override int GetSalary(){        ......    }}class Sales:Employee{    ...    public override int GetSalary(){        ......    }}//显示工资程序Employee e = emFactory.GetEmployee(id);MessageBox.Show(e.GetSalary());

7.现在需求改变了......

示例场景:

随着客户公司业务规模的拓展,又出现了更多类型的员工,比如钟点工、计时工.....等等,这对人事管理系统提出了挑战---原有的程序必须改变。

结构化做法:

几乎所有涉及到员工类型的地方(当然包括“计算工资的地方”)都需要做改变.....这些代码都需要重新编译,重新部署.....

面向对象做法:

只需要在新的文件里添加新的员工类,让其继承自Employee抽象类,并重写GetSalary()方法,然后在EmployeeFactory.GetEmployee()方法中根据相关条件,产生新的员工类型就可以了。其他地方(显示工资程序、Engineer类、Sales类等)则不需要做任何改变。

8.重新认识面向对象

对于前面的例子,从宏观层面来看,面向对象的构建方式更能适应软件的变化,能将变化所带来的影响减为最小。

从微观层面看,面向对象的方式更强调各个类的“责任”,新增员工类型不会影响原来员工类型的实现代码---这更符合真实的世界,也更能控制变化所影响的范围,毕竟Engineer类不应该为新增节点“钟点工”来买单......

对象是什么?

    --从概念层面讲,对象是某种拥有责任的抽象;

    --从规格层面讲,对象是一系统可以被其他对象使用的公共接口;

    --从语言实现层面来看,对象封装了代码和数据。

有了这些认识之后,怎样才能设计“好的面向对象”?

    --遵循一定的面向对象设计原则;

    --熟悉一些典型的面向对象设计模式

9.从设计原则到设计模式

针对接口编程,而不是针对实现编程

    --客户不需知道所使用对象的特定类型,只需要知道对象拥有客户所期望的接口。

优先使用对象组合,而不是类继承

    --类继承通常为“白箱复用”,对象组合通常为“黑箱复用”。继承在某种程度上破坏了封装性,子类父类耦合度高;而对象组合则只要求被组合的对象具有良好定义的接口,耦合度低。

封装变化点

    --使用封装来创建对象之间的分界层,让设计者可以在分界层的一侧进行修改,而不会对另一侧产生不良影响,从而实现层次间的松耦合。

使用重构得到模式---设计模式的应用不宜先入为主,一上来就使用设计模式是对设计模式的最大误用。没有一步到位的设计模式。敏捷软件开发实践提倡的“Refactoring to Patterns”是目前普遍公认的最好的使用设计模式的方法。

10.几条更具体的设计原则:

单一职责原则(SRP):

    --一个类应该仅有一个引起它变化的原因。

开放封闭原则(OCP):

    --类模块应该是可扩展的,但是不可修改(对扩展开放,对更改关闭)。

Liskov替换原则(LSP):

    --子类必须能够替换它们的基类。

依赖倒置原则(DIP):

    --高层模块不应该依赖于底层模块,二者应该依赖于抽象。

    --抽象不应该依赖于实现细节,实现细节应该依赖于抽象。

接口隔离原则(ISP):

    --不应该强迫客户程序依赖于它们不用的方法。

11.总结:

设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案。面向对象设计模式描述了面向对象设计过程中、特定场景下、类与相互通信的对象之间的组织关系。

深刻理解面向对象是学好设计模式的基础,掌握一定的面向对象设计原则才能把握面向对象设计模式的精髓,从而实现灵活运用设计模式。

三大基本面向对象设计原则

    --针对接口编程,而不是针对实现编程

    --优先使用对象组合,而不是类继承

    --封装变化点

使用重构得到模式。敏捷软件开发实践提倡的“Refactoring to Patterns”是目前普遍公认的最好的使用设计模式的方法。


深入Java设计模式的思考与实践:《Think in Pattern (with Java) Revision 0.9》 设计模式是软件工程领域内一种被广泛认可的、用于解决问题的最佳实践。它们是对在特定上下文中反复出现的问题的解决方案。在Java中,设计模式的运用尤为重要,因为它不仅提高了代码的复用性,还提升了系统的可维护性和扩展性。设计模式被组织为几个不同的类别,包括创建型模式、结构型模式和行为型模式,每种都有其独特的应用场景和优势。 阅读详情

相关推荐

ArcMap 10.7/10.8启动加载界面后闪退?可能是这个隐藏的Normal.mxt模板文件在搞鬼

本文深入分析了ArcMap 10.7/10.8启动加载界面后闪退的问题,指出Normal.mxt模板文件损坏是常见原因。提供了从定位、删除模板文件到系统级修复的完整解决方案,帮助GIS工程师快速恢复工作流程。

weixin_28523493的博客 329

设计模式笔记 0.面向对象设计模式与原则

 0.   面向对象设计模式与原则面向对象的两个方向性思维——底层思维/抽象思维向下,如何深入把握机器底层,从微观理解对象构造——底层思维• 语言构造    • 编译转换    • 对象内存模型    • 运行机制    • ……向上,如何将我们的周围世界抽象为程序代码——抽象思维• 面向对象    • 组件封装    • 设计模式    • 架构模式    • ……深入理

fmtmbs的专栏 629

车载测试面试题总结

首先确认是什么问题,如果是测试软件的问题就先确定自己的测试方法有没有问题,如果没有问题,那就是测试软件的问题,这时候就需要提bug 进行跟踪,(比如BCM测试的时候,先明确测试的输入,对输入)进行需求分析,然后设计测试用例,进行用例评审,评审完执行测试用例形成最终的版本,台架分为:hil(黑尔)台架,单个控制器的台架、整车台架、车身台架、动力系统台架等,主要验证其功能,或者实车无法满足的测试环境。这个人不可能一直,点击几千次或者多少次几个小时连续点击,人不可能一直在点。因为要模拟一下这个稳定性,

woaxiaoqing的博客 7812

C#2.0学习4—面向对象高级概念

C#2.0学习4—面向对象高级概念一、接口1.  接口的概念及作用一个例子:一台电脑上的主板和光驱,其实对主板来说,光驱只要是符合它所要求的规格就可以了,具体是哪种光驱,并不重要,它都能兼容。如果我更换一个光驱,没有必要连主板也换。当我们需要一个新的对象时,我们首先考虑,能否定义一个和原有对象功能一致的对象(兼容),而不是修改原有对象,或者做一个全新的对象再如:一个数据库系统中

gongchl2006的专栏 1198

SAP资产按每天折旧功能介绍

注意:此处在计算百分比时将30天作为剩余使用寿命,因为SAPS/4HANA中的计算是通过考虑购置第一年的折旧总天数来进行的。这是因为我在计算总使用寿命时只使用了365天,如果剩余使用寿命大于1年,SAPS/4HANA会将闰年规范化为365天。此功能仅对确定使用寿命或剩余寿命百分比的折旧键有用,如果需要,这种折旧到日的解决方案可以应用于需要每天计算折旧的跨行业(任何国家/行业)。注意:这里在计算百分比时考虑了2天,因为364天已经过期,但目前我们到达2024年,使用寿命为366天。它只会在下一年生效。

yanzibing99的博客 1560

从理论到实践:全面解析Cmk(设备能力指数)的应用与优化

本文全面解析了设备能力指数Cmk的核心概念、计算逻辑与关键应用场景。Cmk作为衡量设备本身固有加工能力的黄金标准,在设备验收、大修后验证及过程能力根因分析中至关重要。文章通过实战案例,详细阐述了执行Cmk测试的“五大固定”黄金法则、数据计算分析方法,并提供了Cmk不达标时的系统性排查与优化策略,帮助制造企业实现预防性质量管理。

jump7的博客 519

系统集成项目管理工程师-结构化设计面向对象设计UML与设计模式

本文摘要: 软件设计分为结构化设计(SD)与面向对象设计(OOD)。结构化设计通过模块化实现高内聚低耦合,包括概要设计(模块划分)和详细设计(实现细节),使用系统结构图等工具。OOD基于抽象、封装和扩展性,遵循七大原则(如单职、开闭原则),通过类图、用例图等UML模型描述系统。UML包含14种图(如顺序图、类图)和四大关系(依赖、关联等)。设计模式分为创建型、结构型、行为型三类,用于复用成功设计。真题示例解析了模块耦合类型(非直接耦合最低)、UML交互图(顺序图强调时间次序)及单职原则定义。 (150字)

专注知识分享,希望可以帮助到需要的同行,感谢关注与支持!专注知识分享,希望可以帮助到需要的同行,感谢关注与支持! 348

VSCode+Keil高效开发STM32:Keil Assistant插件配置全攻略

本文详细介绍了如何通过VSCode的Keil Assistant插件,将Keil MDK的编译调试能力与VSCode的现代编辑体验相结合,打造高效的STM32开发环境。文章涵盖了从环境配置、工程导入、智能提示设置到与STM32CubeMX协同工作的全流程攻略,旨在解决Keil编辑器效率低下的痛点,大幅提升嵌入式开发的编码与项目管理效率。

gold的博客 507

第八章面向对象技术

学生成绩管理系统用例图,参与者为学生、老师、管理员,用例包括「查看成绩」「录入成绩」「修改成绩」,包含关系如「录入成绩」包含「验证权限」,扩展关系如「查看成绩」扩展「导出成绩」,泛化关系如「用户登录」泛化出「学生登录」「老师登录」「学生类」是所有学生对象的模板,张三、李四都是类的实例;制作饮料的固定流程:煮水→冲泡→倒入杯子→加调料,其中加调料是可变步骤,茶加柠檬,咖啡加糖,父类定义骨架,子类实现可变步骤。订单状态图,展示从「待支付」→「已支付」→「已发货」→「已完成」的流转,以及支付、发货等触发事件。

2501_94015172的博客 366

[LaTeX] 调整参考文献的格式(References),包括作者名缩写,行距,字体,引用顺序等等

在此记录我对LaTeX中参考文献references的尝试,主要涵盖如题几个方面。

the Blog of 等不到天亮丶等时光 4万+

VLA数据采集以及训练

直到15s计时结束,弹出下面的内容,这个时候不会录制视频了,这里就是需要复位物体到初始位置,尽量保证物体的初始位置放在一样的位置,计时3s,同样根据自己的复位时间来修改(--dataset.reset_time_s=3),这里和前面录制数据的区别就是fps后面多了一个nment,可以作为一个标记,知道什么时候开始去复位而不会拍到自己的手臂。复制网址,在浏览器打开,会出现下面的窗口,依次检查每一轮是否存在问题,例如是否出现录制不完整,是否存在除了机械臂以外的其他移动物体,这些都可能会影响最终训练的效果。

weixin_45303602的博客 496

软考面对对象分析与设计

软考面对对象分析与设计 事务 (1)结构事务。通常作为uml模型的静态部分,常见的结构事务有类,接口,用例,协作,组件,结点。 (2)行为事务。通常作为uml的动态部分,常见的行为事务有交互,状态机,活动。 (3)分组事务。通常作为uml的组织部分,常见分组事务是包。 (4)注释事务。通常作为UML的注释部分。 2.图 UML1.4版本中,共有9种图。 (1)结构图:类图,对象图,部署图,组件图。 (2)行为图:状态图,顺序图,协作图,活动图,用例图。 UML2...

weixin_59334478的博客 343

RK3588 部署 YOLO26 目标检测:从环境搭建到 NPU 推理

采集图像(500+ 张,覆盖不同光照和角度)→ 筛选(删除模糊、无目标的图像)→ LabelImg 标注(选择 YOLO 格式)→ 划分 train:val:test = 7:2:1labelImg├── train/├── val/nc: 3类别顺序必须与 LabelImg 标注时一致。YOLO26 在 RK3588 上的部署流程是 PC 端训练 → ONNX 导出(opset=11)→ RKNN 转换(INT8 量化)→ 板端推理。

LXY_LOVE36的博客 416

[C++设计模式] 深入理解面向对象设计原则

深入理解面向对象的设计,简略讲解关于面向对象的设计原则。

kevin_blog 1349

android 蓝牙通讯demo

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

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

面向对象的编码设计原则

10之前谈DDD时提及过当下很多标榜面向对象的语言,却是以面向过程来实现的问题。这里就从编码设计的角度来顺一下面向对象设计的一些思维。其实就像我正在梳理的设计模式一样,都是些老生常谈的东西,可是往往在实践的时候,这些老生常谈的东西会被“反刍”,总会有种常看常新的感觉。1。

sdgfafg_25的博客 1413

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

面向对象编程设计原则与设计模式总结

面向对象编程设计原则与设计模式总结,涵盖常见的设计方法

笔记 459

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

山东大学面向对象技术期末复习——设计原则和设计模式详解

本文是主要针对山东大学软件学院面向对象技术课程的设计模式和设计原则部分的总结,包括老师课上讲解的主要设计模式,类图和往年回忆考题中的设计类题目和自己写的代码(都是正确可运行的),希望能帮学弟学妹们做个总结,题主oop96,祝愿学弟学妹oop考试成绩95+............

qq_51618777的博客 2655

【从0开始学设计模式-2| 面向对象设计原则】

面向对象设计原则的简单讲解

DdigitalNomad的博客 1513

高级java每日一道面试题-2024年8月15日-设计模式篇-设计模式与面向对象原则的关系是什么?

设计模式是在面向对象原则基础上发展起来的,它们不仅不违背这些原则,反而是在实践中遵循和强化这些原则。设计模式提供了解决常见设计问题的模板,而面向对象原则则为这些模板的设计提供了理论依据。掌握设计模式的同时深入理解面向对象原则,可以使设计模式的应用更加得心应手,构建出更健壮、更灵活、更易维护的软件系统。

qq_43071699的博客 844

面向对象编程的 SOLID 设计原则

SOLID原则是五个面向对象设计原则的首字母缩写,它们旨在提高软件的可维护性和可扩展性。这些原则是由罗伯特·C·马丁(Robert C. Martin)在20世纪90年代提出的,分别是单一职责原则(S)、开放封闭原则(O)、里氏替换原则(L)、接口隔离原则(I)、依赖倒置原则(D)。

Happy learning and coding journey! 6070

面向对象的基本概念与设计模式的基本原则

面向对象的基本概念与设计模式的基本原则 教材《软件工程导论》中的权威定义: 0.对象:对象是封装了数据结构及可以施加在这些数据结构上的操作的封装体,这个封装体有可以唯一地标识它的名字,而且向外界提供一组服务(即共有的操作)。 1.类(class):在面向对象的软件技术中,“类”就是对具有相同数据和相同操作的一组相似对象的定义,也就是说,类是对相同属性和行为的一个或多个对象的描述。 2.实例

cyl937的专栏 1808

设计模式_0_面向对象原则

对于面向对象的三大特性(封装、继承、多态),几乎是所有人都能张口就来的,但学习设计模式之前,依旧应该好好复习一下面向对象的设计原则,不仅是由于拘泥于背定义的前提下去理解的原则永远只是纸面功夫,更是因为这六大原则几乎贯穿所有设计模式之中,甚至可以基于他们来构建属于自己的设计模式。 首先来认识一下,对象到底是什么? 从语言层面来讲,对象是封装了代码和数据的结合体 从规格层面来讲,对象是一系列可以被使用的公共接口, 从概念层面来讲,对象是一种拥有责任的抽象体。 基于上述的理解,这种面向对象的形式,从宏观层

weixin_43582505的博客 144

设计模式(面向对象六大原则)(总结)

单一职责原则-Single Responsibility Principle-SRP 定义:就一个类而言,应该仅有一个引起它变化的原因。 实际开发: 单一职责所表达出的用意就是”单一“二字。如何划分一个类,一个函数的职责,每个人都有自己的看法,这需要根据个人经验、具体的业务逻辑而定,他也有一些基本的指导原则,例如,两个完全不一样的功能就不应该放在一个类中。一个类中应该是一组相关性很高的函数、数据的封装。工程师可以不断的审视自己的代码,根据具体的业务、功能对类进行相应的拆分,这事程序员优化代码迈出的第一步。

ZPCrobot的博客 591
上一篇: Martin Fowler 经典软件著作合集
下一篇: storm问题总结
架构师的清醒
博客等级 码龄14年 291粉丝 397原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值