设计模式六大原则,參见http://www.uml.org.cn/sjms/201211023.asp

1. 单一职责原则

定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类仅仅负责一项职责。

问题由来:类T负责两个不同的职责:职责P1。职责P2。当因为职责P1需求发生改变而须要改动类T时,有可能会导致原本执行正常的职责P2功能发生问题。

解决方式:遵循单一职责原则。分别建立两个类T1、T2,使T1完毕职责P1功能。T2完毕职责P2功能。这样,当改动类T1时。不会使职责P2发生问题风险;同理,当改动T2时,也不会使职责P1发生问题风险。

2. 里氏替换原则

这项原则最早是在1988年,由麻省理工学院Barbara Liskov女士提出,故称里氏替换原则。

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

问题由来:有一功能P1。由类A完毕。现须要将功能P1进行扩展,扩展后的功能为P。当中P由原有功能P1与新功能P2组成。新功能P由类A的子类B来完毕,则子类B在完毕新功能P2的同一时候,有可能会导致原有功能P1发生问题。

解决方式:当使用继承时。遵循里氏替换原则。类B继承类A时。除加入新的方法完毕新增功能P2外,尽量不要重写父类A的方法,也尽量不要重载父类A的方法。

里氏替换原则通俗的来讲就是:子类能够扩展父类的功能。但不能改变父类原有的功能。

它包括下面4层含义:

Ø 子类能够实现父类的抽象方法,但不能覆盖父类的非抽象方法。

Ø 子类中能够添加自己特有的方法。

Ø 当子类的方法重载父类的方法时,方法的前置条件(即方法的形參)要比父类方法的输入參数更宽松。

Ø 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

3. 依赖倒置原则

依赖倒置原则的核心思想是面向接口编程。

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

问题由来:类A直接依赖类B。假如要将类A改为依赖类C。则必须通过改动类A的代码来达成。

这样的场景下,类A通常是高层模块。负责复杂的业务逻辑。类B和类C是低层模块,负责主要的原子操作;假如改动类A,会给程序带来不必要的风险。

解决方式:将类A改动为依赖接口I。类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大减少改动类A的几率。

4. 接口隔离原则

定义:client不应该依赖它不须要的接口。一个类对还有一个类的依赖应该建立在最小的接口上。

问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,假设接口I对于类A和类B来说不是最小接口。则类B和类D必须去实现他们不须要的方法。

解决方式:将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们须要的接口建立依赖关系。

也就是採用接口隔离原则。

5. 迪米特法则

迪米特法则又叫最少知道原则。最早是在1987年由美国Northeastern University的Ian Holland提出。通俗的来讲,就是一个类对自己依赖的类知道的越少越好。

定义:一个对象应该对其它对象保持最少的了解。

问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对还有一个类的影响也越大。

解决方式:尽量减少类与类之间的耦合。

6. 开闭原则

定义:一个软件实体如类、模块和函数应该对扩展开放,对改动关闭。

问题由来:在软件的生命周期内,由于变化、升级和维护等原因须要对软件原有代码进行改动时,可能会给旧代码中引入错误,也可能会使我们不得不正确整个功能进行重构。而且须要原有代码经过又一次測试。

解决方式:当软件须要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过改动已有的代码来实现变化。

C++技术问题总结-第12篇 设计模式原则的更多相关文章

  1. [转]有哪些值得关注的技术博客(Java篇)

    有哪些值得关注的技术博客(Java篇)   大部分程序员在自学的道路上不知道走了多少坑,这个视频那个网站搞得自己晕头转向.对我个人来说我平常在学习的过程中喜欢看一些教程式的博客.这些博客的特点: 1. ...

  2. JAVA技术专题综述之线程篇(1)

    本文详细介绍JAVA技术专题综述之线程篇 编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield( ...

  3. Yeslab 华为安全HCIE七门之-防火墙基础(12篇)

    Yeslab 华为安全HCIE七门之-防火墙基础(12篇) Yeslab 全套华为安全HCIE七门之第二门防火墙基础(12篇),第一门课论坛很早就有了,可自行下载,后面的陆续分享给大家. 华为安全HC ...

  4. Mysql高手系列 - 第12篇:子查询详解

    这是Mysql系列第12篇. 环境:mysql5.7.25,cmd命令中进行演示. 本章节非常重要. 子查询 出现在select语句中的select语句,称为子查询或内查询. 外部的select查询语 ...

  5. CVPR2020文章汇总 | 点云处理、三维重建、姿态估计、SLAM、3D数据集等(12篇)

    作者:Tom Hardy Date:2020-04-15 来源:CVPR2020文章汇总 | 点云处理.三维重建.姿态估计.SLAM.3D数据集等(12篇) 1.PVN3D: A Deep Point ...

  6. 《JavaScript高级程序设计》学习笔记12篇

    写在前面: 这12篇博文不是给人看的,而是用来查的,忘记了什么基础知识,点开页面Ctrl + F关键字就好了 P.S.如果在对应分类里没有找到,麻烦告诉我,以便尽快添上.当然,我也会时不时地添点遗漏的 ...

  7. Spring第12篇—— Spring对Hibernate的SessionFactory的集成功能

    由于Spring和Hibernate处于不同的层次,Spring关心的是业务逻辑之间的组合关系,Spring提供了对他们的强大的管理能力, 而Hibernate完成了OR的映射,使开发人员不用再去关心 ...

  8. JBOSS集群技术升级版解决方案分享(图示篇)

    JBOSS集群技术升级版解决方案分享(实现篇)           前段时间,由于阿堂一直较忙,没有写点什么了,有空时一直在关注"web架构和性能,高并发,Cache层"技术领域的 ...

  9. 服务端技术进阶(八)GitHub入门篇

    服务端技术进阶(八)GitHub入门篇 前言 在投递简历的过程中,发现有的公司会要求填写自己的GitHub地址,而自己却还没有GitHub帐号,准确点说是自己还不太会使用GitHub.(貌似开源社区中 ...

随机推荐

  1. ANDROID开发之SQLite详解

    本文转自:http://www.cnblogs.com/Excellent/archive/2011/11/19/2254888.html

  2. HDU 5489 Removed Interval

    题意:求一段序列中删掉L个连续元素后的LIS. 解法:我的想法很复杂= =怎么说呢……首先用nlogn的方法求LIS得到的序列dp的第i项的意义为上升子序列所有长度为i的序列结尾元素的最小值,那么先倒 ...

  3. DevExpress licenses.licx 的解决方法 z

    在 使用DevExpress控件的时候.每次对窗体进行更改的时候,都会出现一个对话框.发布的时候 也会出现一个对话框.之前的解决方法是在发布的时候把licenses.licx给删除掉,但是这个方法治标 ...

  4. Delphi读取Word

    Delphi读取Word现在关于往Word中写入数据的方法比较多,现在专门开个贴子,希望大家把自己读取Word内容的心得体会说一下,包括读取word文档中,有几个段落,如何读取第几个段落,读取有拼音的 ...

  5. SSH超时断开(ClientAliveInterval和ClientAliveCountMax )的使用

    有 2个方法 1 配置服务器 打开 /etc/ssh/sshd_config 找到 ClientAliveInterval 参数,如果没有就自己加一行 数值是秒,比如你设置为300,就是5分钟. Cl ...

  6. 【Linux学习】 包含子目录的makefile简单应用

    1 .目录结构 practice6 / ui / ui.h   ui.c practice6 / dal / dal.h dal.c practice6 / bll / bll.h  bll.c pr ...

  7. BootStrap入门教程 (三) :可重用组件(按钮,导航,标签,徽章,排版,缩略图,提醒,进度条,杂项)

    上讲回顾:Bootstrap的基础CSS(Base CSS)提供了优雅,一致的多种基础Html页面要素,包括排版,表格,表单,按钮等,能够满足前端工程师的基本要素需求. Bootstrap作为完整的前 ...

  8. j2ee的十三个规范

    转载 今天在做连接oracle数据库的时候,感受到了什么是规范.平时听到别人说学习j2ee一定要学习他的十三个规范,大概的知道每个规范是做什么的,每个“接口”是做什么的.          很早就听过 ...

  9. Shell统计报表表格生成

    基本需求 分析完数据后,一般需要将数据以附件的形式发送处理,这个已经在<>中有介绍,如何 用Python实现附件的发送. 但不是所有人都关心附件的内容,一般邮件中需要有些概要的信息,如附件 ...

  10. oracle中DECODE与CASE的用法区别

    对于CASE与DECODE其实并没有太多的区别,他们都是用来实现逻辑判断.Oracle的DECODE函数功能很强,灵活运用的话可以避免多次扫描,从而提高查询的性能.而CASE是9i以后提供的语法,这个 ...