首页 > 其他分享 >【软件开发学习笔记】设计模式

【软件开发学习笔记】设计模式

时间:2024-01-14 11:56:57浏览次数:28  
标签:笔记 软件开发 原则 子类 模式 接口 设计 设计模式

【软件开发学习笔记】设计模式

设计模式

设计模式是一种针对面向对象语言的软件设计方法,是对类设计的约束和指导。

设计模式由“原则”和“方法”两部分组成,一个设计良好的项目结构应能完美符合“原则”中的要求,而为了实现完美往往需要按照“方法”的指导去设计。

  • 原则:
    这是必须要记住的内容,但要注意的是原则是一种思想,仅靠死记硬背一点用都没有,必须要真正理解后才能使用。
  • 方法:
    方法在各个不同的开发环境中可能会有所区别,所以仅是一种参考,具体还需要配合相关原则因地制宜的使用,若不知其意却强行使用结果只会东施效颦。而且只要真正理解了设计原则,并且对编程语言足够熟悉的话,设计方法是可以自己推导出来的,所以若是特意要去背着玩意我觉得有点吃力不讨好。

设计原则

对于一个设计良好项目所应具有的特征,设计模式提出了7点原则。

一、开闭原则

这是设计模式最根本的原则,可以说其他原则也都是为满足这一原则而产生的,同时这也是面向对象方法的特点和优势,正因为面向对象语言中的种种特性开闭原则才得以实现。

程序的功能扩展不能以直接修改源代码的方式进行。

程序出Bug的根本原因就是增改代码,只要现有代码被改动就可能导致出错,如果代码间存在耦合那其他功能也必然会受到牵连,而且这种方式对团队协作也很不友好。

所以通过直接改原代码来扩展功能是很不明智的,为此我们要发挥面向对象方法,另辟蹊径的解决它,而在设计对象时按以下原则进行,可以更好的满足需求。

设计父子关系(继承方案)

二、里氏替换原则

确保任何基类可以出现的地方,一定可以子类实现并代替,且替换后子类不会影响原功能的运行。

利用继承和多态,我们便可以实现完全不动老代码方式扩展功能,从而满足开闭原则,而针对这种编程方式,我们给它命名为“面向接口编程”,而针对面向接口编程的设计方案又给我们带来了下面的这些原则。

三、依赖倒转原则

如果某功能存在扩展的需求,那我们应当将这部分代码接口化来隐藏细节,实现让功能依赖于接口而非实现。

实现不再被依赖,所以它可以成为一个个独立自由的个体,我们可以很方便很安全的进行开发和修改,且不会干扰到原有模块,因为他们只认接口而非实现。

四、接口隔离原则

在设计接口时应保证模块化,保证任何接口内容的使用都是必要的。

面向接口编程时,在设计上应尽可能保证提供多个相互独立的接口,而非臃肿的一整块,这可以减少耦合性,不然这些接口反而会成为累赘,逼着别人违反单一职责原则。

设计对象关系(组合方案)

五、合成复用原则

实现功能复用时优先采用组合或聚合,其次才考虑继承。

继承仍然会产生耦合性,子类将无法摆脱父类的存在,在部分开发框架下还会水土不服(如Unity中替换父子组件依旧需要删除重建),所以合成复用原则引导我们使用另一种解决方案“组合”。

组合是直接通过增设更多的功能模块从而实现功能的扩展,它不受一些继承问题带来的限制,产生的耦合性也小的多,而具体的模块设计方案,则引出了下面的原则。

六、单一职责原则

每个模块都应该仅负责少量且专精的功能(模块内高内聚)。

七、最少知道原则(迪米特原则)

一个模块应尽可能减少对其他模块的使用,使系统功能相对独立(模块间低耦合)。

设计方法

创建型模式(5):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式(7):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式(11):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

附注

Unity中采用设计模式的例子?

Unity框架中,所有碰撞体都继承了Collider类,通过里氏替换原则,子类得以可以自由扩展功能,且Unity还不需要做任何额外工作,一套旧代码就能处理任何新子类。

不同碰撞体间的差异需求导致产生了诸如BoxCollider,SphereCollider等子类,这些子类符合单一职责原则和最少知道原则,仅额外简单的实现了些形状上的差异,所以开发和使用时也不会相互影响。

但一个刚体往往需要的形状是非常复杂的,上述这些碰撞体由于过于简单都无法满足需求,此时Unity便采用组合的方式,支持将不同碰撞体同时使用,这样不需要写任何代码就能随意搭配更复杂的碰撞形状来。

假如不采用上述方案,那每一个子类都要单独写处理的代码,每一个新需求又会导致要重新写一个新子类,一两个还好,要是几十几百个,那项目维护开发绝对是灾难性的。

为什么设计模式中只提到了类和接口而没提事件委托?

虽然上文只提到了类和接口,但实际上包括一些语言中的委托事件这些都应该算在内,因为它们都有一个共同特点就是都有将算法的一部分参数化的功能。那为何此处只提到了类和接口呢?如果使用过java就很容易理解了,因为java中不存在委托类型,到处使用的都只有接口和匿名类,而它们其实就是委托事件的前身。

标签:笔记,软件开发,原则,子类,模式,接口,设计,设计模式
From: https://www.cnblogs.com/BDFFZI/p/17963499

相关文章

  • 阅读笔记《需求工程软件建模与分析》上
    当涉及到《需求工程软件建模与分析》时,通常是指在软件开发过程中对需求进行建模和分析的相关内容。这方面的阅读笔记可以从两个不同的角度进行,一个是建模,另一个是分析。阅读笔记一:需求工程软件建模1.概述建模的重要性在软件开发中,需求建模是一个关键的阶段。了解客户需求、系......
  • 阅读笔记《需求工程软件建模与分析》下
     1.分析过程的关键步骤 需求收集:确保全面收集和理解用户需求,包括功能性和非功能性需求。需求分析:对收集到的需求进行详细的分析,识别可能的冲突或不一致性。需求验证:确保需求是准确、完整、一致且可追溯的,以便于后续的开发过程。 2.分析工具和技术 数据流图:描述......
  • Programming Abstractions in C阅读笔记:p246-p247
    《ProgrammingAbstractionsinC》学习第68天,p246-p247总结,总计2页。一、技术总结本章通过“thegameofnim(尼姆游戏)”,这类以现实生活中事物作为例子进行讲解的情况,往往对学习者要求比较高,需要学习者具备一定的人文、历史知识或专业知识,如果缺乏这方面的知识,就会导致读者在......
  • Java多线程编程实战指南(设计模式篇)PDF
    随着CPU多核时代的到来,多线程编程在充分利用计算资源、提高软件服务质量方面扮演了越来越重要的角色。而解决多线程编程中频繁出现的普遍问题可以借鉴设计模式所提供的现成解决方案。然而,多线程编程相关的设计模式书籍多采用C++作为描述语言,且书中所举的例子多与应用开发人员的......
  • 读元宇宙改变一切笔记07_硬件与互操作性(上)
    1.      元宇宙的头号入口1.1.        元宇宙最令人兴奋的地方在于,我们可以借此开发用来访问、渲染和操纵它的新设备1.1.1.          AppNewton于1993年发布,是世界上第一款掌上电脑1.2.        功能超强大又轻巧的AR和沉浸式VR头显1.2.......
  • 1/13 学习进度笔记
    今日安装了PySpark库以及学习了如何在Windows系统中通过SSH远程连接Linux系统使用Python语言来开发Spark程序什么是PySpark 我们前面使用过bin/pyspark程序,要注意,这个只是一个应用程序,提供一个Python解释器执行环境来运行Spark任务我们现在说的PySpark,指的是Python的......
  • gin学习笔记(三)—— 会话管理
    会话管理HTTP会话管理HTTP协议的特点是一问一答(请求然后响应)。基本上,Web应用都实现了用户管理,因此当用户发送请求时,服务器要能识别出是哪个用户,最简单的方法就是客户端每次请求,都附上用户信息。这样既不安全也不高效,故提出会话(Session),会话一般存储用户信息。服务端会话(S......
  • 学习笔记4
    RDD操作对于RDD而言,每一次转换操作都会产生不同的RDD,供给下一个“转换”使用,转换得到的RDD是惰性求值的,也就是说,整个转换过程只是记录了转换的轨迹,并不会发生真正的计算,只有遇到行动操作时,才会发生真正的计算,开始从血缘关系源头开始,进行物理的转换操作;常用的RDD转换操作,总结如下......
  • 大三寒假学习进度笔记4
    今日学习时间两小时,开始学习RDD的内容,学习了RDD的创建和RDD算子的定义分类RDD学习:RDD五大特征:RDD是有分区的分区是RDD数据存储的最小单位计算方法会作用到每一个分区上RDD之间是由相互依赖的关系的KV型RDD可以有分区器KV型RDD:存储的数据是二元元组RDD分区数据的读取会尽......
  • 2024/1/13 算法笔记
    1.二分查找的原则当要查找的值target>mid就在mid和right中查找当要查找的值target<mid就在left和mid中查找对于边界条件的处理:while(l<r)mid的取值是[l,r)重点是下面部分,直接决定使用哪个二分模板。1.3中间值归属问题这个问题其实比较灵活,这里我只讨论3种情况,其余情况......