C++技术问题总结-第12篇 设计模式原则
设计模式六大原则,參见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篇 设计模式原则的更多相关文章
- [转]有哪些值得关注的技术博客(Java篇)
有哪些值得关注的技术博客(Java篇) 大部分程序员在自学的道路上不知道走了多少坑,这个视频那个网站搞得自己晕头转向.对我个人来说我平常在学习的过程中喜欢看一些教程式的博客.这些博客的特点: 1. ...
- JAVA技术专题综述之线程篇(1)
本文详细介绍JAVA技术专题综述之线程篇 编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield( ...
- Yeslab 华为安全HCIE七门之-防火墙基础(12篇)
Yeslab 华为安全HCIE七门之-防火墙基础(12篇) Yeslab 全套华为安全HCIE七门之第二门防火墙基础(12篇),第一门课论坛很早就有了,可自行下载,后面的陆续分享给大家. 华为安全HC ...
- Mysql高手系列 - 第12篇:子查询详解
这是Mysql系列第12篇. 环境:mysql5.7.25,cmd命令中进行演示. 本章节非常重要. 子查询 出现在select语句中的select语句,称为子查询或内查询. 外部的select查询语 ...
- CVPR2020文章汇总 | 点云处理、三维重建、姿态估计、SLAM、3D数据集等(12篇)
作者:Tom Hardy Date:2020-04-15 来源:CVPR2020文章汇总 | 点云处理.三维重建.姿态估计.SLAM.3D数据集等(12篇) 1.PVN3D: A Deep Point ...
- 《JavaScript高级程序设计》学习笔记12篇
写在前面: 这12篇博文不是给人看的,而是用来查的,忘记了什么基础知识,点开页面Ctrl + F关键字就好了 P.S.如果在对应分类里没有找到,麻烦告诉我,以便尽快添上.当然,我也会时不时地添点遗漏的 ...
- Spring第12篇—— Spring对Hibernate的SessionFactory的集成功能
由于Spring和Hibernate处于不同的层次,Spring关心的是业务逻辑之间的组合关系,Spring提供了对他们的强大的管理能力, 而Hibernate完成了OR的映射,使开发人员不用再去关心 ...
- JBOSS集群技术升级版解决方案分享(图示篇)
JBOSS集群技术升级版解决方案分享(实现篇) 前段时间,由于阿堂一直较忙,没有写点什么了,有空时一直在关注"web架构和性能,高并发,Cache层"技术领域的 ...
- 服务端技术进阶(八)GitHub入门篇
服务端技术进阶(八)GitHub入门篇 前言 在投递简历的过程中,发现有的公司会要求填写自己的GitHub地址,而自己却还没有GitHub帐号,准确点说是自己还不太会使用GitHub.(貌似开源社区中 ...
随机推荐
- mysql使用经验总结
在工作中难免会遇到一些这个问题那个问题,当然在mysql中也不例外.今天就让我们来学学mysql中一些比较常用的东西 . 1.有时我们想去查某张表中的字段,但是表中的数据多,字段也很多,如果用sel ...
- HDU 4267-A Simple Problem with Integers(多个BIT)
题意: 2种操作 1 a b k c 在区间[a,b]中的(i-a)%k==0的位置i上的数+c 2 a 查询位置a的值 输出每次查询的值 分析: 开始想到多维的线段树,但比较麻烦,看了题解才知道,用 ...
- HDU5779 Tower Defence (BestCoder Round #85 D) 计数dp
分析(官方题解): 一点感想:(这个题是看题解并不是特别会转移,当然写完之后看起来题解说得很清晰,主要是人太弱 这个题是参考faebdc神的代码写的,说句题外话,很荣幸高中和faebdc巨一个省,虽然 ...
- [原创]个人工具 - YE快速复制助手(YeFastcopyHelper)
版本:v1.3.216 更新时间:2014/02/16 * 代码完善 + 右键关于显示当前版本号,点击并链接到软件帮助页 Technorati 标签: NET,.NET 3.5,asion C#,Ch ...
- uC/OS-II 移植笔记
用过51.AVR.Freescale.STM32,但是写程序一直没有用过实时操作系统,一是因为写的项目不大,二是不太想去看手册学东西.现在写的项目也算比较大,因为需要,所以就学一下,这样也不至于每次的 ...
- Windows7 64位系统下无法安装网络打印机的解决方法
背景: 公司一台HP LaserJet 1010 打印机连在一台Windows XP的电脑上,而我的是windows7 64位系统,无法安装驱动解决办法:1:去惠普官网上下载对应的64位驱动(什么Vi ...
- <转>亲手缔造DNS体系,创建DNS私有根:DNS系列之六
打造DNS私有根 我们现在已经从前面的博文中了解到了很多DNS的相关知识,今天我们用一个综合性的实验把前面的内容都串起来复习一下,这个有趣的实验就是DNS的私有根.私有根顾名思义是由个人或企业自行创建 ...
- 《Linux命令行与shell脚本编程大全》 第三章 学习笔记
第三章:基本的bash shell命令 bash程序使用命令行参数来修改所启动shell的类型 参数 描述 -c string 从string中读取命令并处理他们 -r 启动限制性shell,限制用户 ...
- ubuntu 14.04 允许root 登录
在/etc/lightdm/lightdm.conf里添加一下两句: greeter-show-manual-login=true allow-guest=false
- 安卓升级提示 phoneGap APK软件更新提示
以下代码由PHP200 阿杜整理 package com.example.syzx; import java.io.BufferedReader; import java.io.File; imp ...