目录

设计模式之遵循原则

1. 单一职责原则(SRP)

1.1 设计目的

1.2 定义

1.3 应用

2. 开放-封闭原则(OCP)

2.1 设计目的

2.2 定义

2.3 应用

3. 依赖倒转原则

3.1 设计目的

3.2 定义

3.3 应用

4. 迪米特法则(LoD,最少知识原则)

4.1 设计目的

4.2 定义

4.3 应用


设计模式之遵循原则

注:以下内容均参考《大话设计模式》。

1. 单一职责原则(SRP)

1.1 设计目的

我们在做编程的时候,会很自然的给一个类添加各种各样的功能,比如我们写一个窗体应用程序,一般都会生成一个Form这样的类,于是我们就把各种各样的代码,像商业运算的算法,像数据库访问的SQL语句都写入到该类中,这样意味无论任何需求要来,你都需要改变这个窗体类,这样维护麻烦,无法复用,缺乏灵活性。

所以我们在设计一个类时,要遵循单一职责,让类具备原子化属性。

1.2 定义

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

1.3 应用

设计俄罗斯方块:

  1. 分别设计3个窗体的Form类, WallForm(背景容器), NewShapeForm(新产生的形状), ResultShapeForm(最终组合的形状),输入参数,横纵坐标,和形状代码。
  2. 设计Operation类,用于产生随机的NewShape的输入参数,产生改变形状的code,挪移的输入横纵坐标,获取Form的当前位置,已经最后合并操作等属性。

2. 开放-封闭原则(OCP)

2.1 设计目的

在设计模式中,软件系统给架构更新,不破坏原有的软件内容去扩展新的内容,从而对旧版本软件兼容 。而不至于说,新的需求一来,就要把整个程序推倒重来。

2.2 定义

是指软件实体(类、模块、函数等)应该可以扩展,但是不可以修改。用人话就是,软件实体具有可扩展性,已经设计好的内容不用再去修改,这样就支持旧版本的兼容。(多扩展,少修改)

但无论模块是多么的封闭,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员就必须对于他设计的模块应该对哪种封闭做出选择。他必须先猜测出最有可能发生的变化种类。然后构造抽象来隔离那些变化。需求的变化很难预测,但我们可以在发生很小的变化时就采取行动

在我们最初写代码是,假设变化不会发生。当变化发生时,我们就创建抽象来隔离以后发生的同类变化。

我们希望的是在开发工作展开不久就知可能发生的变化。查明可能发生的变化所灯带的时间越长,要创建正确的抽象就越困难。

!!!开发人员应该仅对程序中呈现出频繁变化的那些部分做出抽象。对于应用程序中每个部分都刻意地进行抽象同样不是一个好主意,拒绝不成熟的抽象和抽象本身一样重要。过犹不及。

2.3 应用

以计算器程序为例:

  1. 首先在一个类中设计了一个加法函数功能。
  2. 然后再添加一个减法的需求,此时就需要考虑重构,抽象一个运算类,加法和减法都是运算类的子类。
  3. 最后又追加了一个乘除的需求,此时只需要再分别添加乘法和除法的子类,就可以完成业务,而不用修改现有的代码。

3. 依赖倒转原则

3.1 设计目的

为了让对象强内聚,对象和对象之间松耦合。解决模块与指定模块的强耦合关系。比如,一厂家内存条插口只能给自己的定制的主板使用,因为主板和内存条是定制的接口,不是符合市面上标准接口,主板就无法再用其他厂家的内存条了。所以这个原则应运而生。定义一个大家都使用的接口。

3.2 定义

a) 高层模块不应该依赖低层模块。两个都应该依赖抽象。用人话就是高层模块使用低层模块也只是使用低层模块的接口或抽象类,这样当低层模块所代表的子类对象改变时,高层模块并不会受到影响。另外,高层模块也应是一个抽象的接口或抽象类。增加高层模块的复用性和灵活性。这里的高层模块和低层模块都是那些频繁使用的模块

b) 原话解释是抽象不应该啊依赖于细节,细节应该依赖于抽象。说白了就是针对接口编程,而不是对实现编程,不管是大模块还是小模块

3.3 应用

以设计建筑模块(欧式或中式)为例:

1. 抽象一个建筑模块Building, 派生子类EuropeanBuilding或ChinneseBuilding,也可以两个都派生。

2. 抽象一个内部房间模块Room, 派生子类EuropeanRoom或ChineseRoom,也可以都派生。

3. 为了在Building中灵活选择内部房间类型Room, 两个子类中都添加Art 属性,并赋予相应的中式还是欧式作为内部装修方式。

4. 这样,在使用建筑模块的时候,就可以灵活选择模式,即  “中式建筑+中式room,中式建筑+欧式Room, 欧式建筑+中式Room, 欧式建筑+欧式Room”。

4. 迪米特法则(LoD,最少知识原则)

4.1 设计目的

降低类之间的耦合

4.2 定义

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

迪米特法则首先强调的前提是在类的结构设计上,每一个类都应该尽量降低成员的访问权限。其根本思想是强调了类之间的松耦合。类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。

4.3 应用

C++ 设计模式之遵循原则相关推荐

  1. 设计模式中遵循的原则:单一职责、开发-封闭、依赖倒转

    设计模式中遵循的原则:单一职责.开放-封闭.依赖倒转 单一职责原则 一个类而言,应该仅有一个引起它变化的原因. 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或者抑制这 ...

  2. 设计一个矩形类rectangle_万字长文带你捋清六种设计模式的设计原则(建议收藏)...

    对于设计模式,自己很早之前就看了好多本设计模式书籍,其中一些还看了好几遍,也一直希望自己能在编码的时候把这些设计模式用上去.可是,在日常的打码中,用的最多的就是单例,其次是观察者和建造者模式 ( bu ...

  3. Java设计模式-七大设计原则

    Java设计模式 设计模式七大原则 设计模式的目的 编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性 等多方面的挑战,设计模式是为了让程序(软件),具有更好 代码 ...

  4. 设计模式_01_单一原则

    设计模式_01_单一原则 package designPatternOf_01; /*** 单一原则示例:动物呼吸* 引入的问题:鱼不吸空气,吸水*/ public class SinglePrinc ...

  5. 【设计模式 00】设计模式的六大原则

    设计模式的六大原则 参考: 设计模式六大原则 1. 单一职责原则 一个类只负责一个明确的功能 优点: 降低类的复杂度,提高代码可读性和可维护性 降低变更时对其他功能的影响 2. 里氏替换原则 **原则 ...

  6. 实践GoF的23种设计模式:SOLID原则(上)

    本文分享自华为云社区<实践GoF的23种设计模式:SOLID原则(上)>,作者:元闰子. 前言 从1995年GoF提出23种设计模式到现在,25年过去了,设计模式依旧是软件领域的热门话题. ...

  7. 代码规范七大原则_设计模式的七大原则详解||上篇

    Hello 丨World  当机会变得稀有,当竞争变得激烈 当方向不再清晰,当风口不再有风 关键词||设计模式 全文约7685字,细读大约需要20分钟 1 认识设计模式 1.1 什么是设计模式 所谓设 ...

  8. 面试官问你如何进行程序设计?——设计模式之七大原则——接口隔离、合成复用、迪米特法则以及C++设计实现

    设计模式的设计原则之2.0 七大原则 5.接口隔离(InterfaceSegregation Principle,ISP) 5.1.背景 5.2.定义 5.3.特征 5.4.应用 6.迪米特原则(La ...

  9. 设计模式的六大原则(SOLID)

    设计模式的六大原则有: Single Responsibility Principle:单一职责原则 Open Closed Principle:开闭原则 Liskov Substitution Pr ...

最新文章

  1. java版mc植物生长条件_植物生长需要的五个条件
  2. IOS开发网络第一天之06线程之间的通信
  3. ubuntu source
  4. 如何突破JAVA程序员的分水岭
  5. morphological antialiasing
  6. Upload-Labs(16)
  7. 你计算机使用中间层服务器,k3中间层的配置及应用问题.doc
  8. 让代码不运行的快捷键html5,使用 vscode 实现写代码双手不用离开键盘
  9. 禁止选中页面内容-兼容ie、firefox、chrome
  10. 什么是飞秒激光技术?
  11. 为什么Service层要定义接口?
  12. 用BVP一比一还原自如客APP裸眼3D效果(Android原生)
  13. lyx插入图片和表格
  14. 类加载顺序及加载过程详解
  15. 【mysql】mysql 常用建表语句
  16. JavaScript判断当前浏览器是否为IE或者Edge
  17. Internet History, Technology and Security (Week5.1)
  18. 使用Synology群晖内置web station和榴莲壳发布自己的网站(一)安装Web Station
  19. 高质量PM,都用哪些优质的开源项目管理工具
  20. 【caffe】caffe之反卷积层

热门文章

  1. 算术公理化的发明人—格拉斯曼
  2. (二)典型KBQA 系统介绍:IBM WASTON
  3. NED下姿态转换到ENU下
  4. ENU与ecef与WGS84相互转换(c++和python)
  5. 使用51单片机模拟红外线遥控器的按键发射的红外线
  6. 逆向爬虫-sojson混淆反调加密
  7. 【MySQL】MySQL NDB Cluster安装
  8. 解析EIT遇到的问题
  9. vux 显示 html,如何在vue项目中使用vux
  10. Keil MDK最新版 5.25介绍及下载地址