1. 变化是复用的天敌!

面向对象设计的最大优势在于 : 抵御变化

2. 重新认识面向对象

理解隔离变化:

从宏观层面来看,面向对象的构建方式更能适应软件的变化,

能将变化所带来的影响减为最小。

各司其职:

从微观层面来看,面向对象的方式更强调各个类的”责任“

(代码示例中,各个类型图形,各自实现自己的draw)

由于需求变化导致的新增类型不应该影响原来类型的实现 ——各负其责。

对象是什么?

从语言实现的层面,对象是封装了代码和数据。

从规格层面讲,对象是一系列可被使用的公共接口。

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

3. 面向对象设计原则 (原则比具体的模式更重要)

模式不能违背原则,代码调用流程、技巧远没有设计原则重要。

1) 依赖导致原则(DIP)

高层模块(稳定)不应该依赖于底层模块(变化),二者都应该依赖于抽象(稳定)。

抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖于抽象(稳定)

对应于代码示例:

高层模块(Mainform)不应该依赖于底层模块(Line,Rec),二者都应该依赖于抽象(Shape)

实现细节(Line,Rec)应该依赖于抽象。将变化(Line,Rec)隔离

2)开放封闭原则(OCP)

  对扩展开放,对更改封闭。

  类模块应该是可扩展的,但是不可修改。

对应于代码示例:

第一种设计方式中存在改变(52行,89行,120行);

而第二种设计方式为扩展增加,不修改源代码。

3)单一职责原则(SRP)

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

  变化的方向隐含着类的责任。

参见后续桥模式、装饰者模式

4) Liskov替换原则(LSP)

  子类必须能够替换他们的基类(IS-A)

  继承表达类型抽象。

5)接口隔离原则(ISP)

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

  接口应该小而完备。

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

  类继承通常为”白箱复用“,对象组合通常为”黑箱复用“。

  继承在某种程度上破坏了封装性,子类父类耦合度高。

  而对象组合则只要求被组合的对象具有良好定义的接口,耦合度低。

7)封装变化点

  使用封装来创建对象之间的分界层,让设计者可以在分界层的一侧进行修改,

  而不会对另一侧产生不良的影响,从而实现层次间的松耦合。

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

  不将变量类型声明为某个特定的具体类,而是声明为某个接口。

  客户程序无需获知对象的具体类型,只需要知道对象所具有的接口。

  减少系统中各部分的依赖关系,从而实现”高内聚,松耦合“的类型设计方案。

对应于代码示例:

vector<Line>, vector<Rec>就是声明为某个特定类,客户程序需要获知具体对象;

vector<Shape*>声明为某个接口,客户程序只需要知道所具有的接口(Shape)。

与依赖倒置原则是从不同角度看待问题,相辅相成。

C++ 设计模式2 (面向对象设计原则)的更多相关文章

  1. 设计模式学习(二):面向对象设计原则与UML类图

    一.UML类图和面向对象设计原则简介 在学习设计模式之前,需要找我一些预备知识,主要包括UML类图和面向对象设计原则. UML类图可用于描述每一个设计模式的结构以及对模式实例进行说明,而模式结构又是设 ...

  2. 学习记录:《C++设计模式——李建忠主讲》2.面向对象设计原则

    1.课程内容: 重新认识面向对象:面向对象设计原则: 2.重新认识面向对象 1)理解隔离变化:从宏观层面来看,面向对象的构建方式更能适应软件的变化,将变化所带来的影响减为最小: 2)各司其职:从微观层 ...

  3. 设计模式学习笔记(二):UML与面向对象设计原则

    1 UML 1.1 UML UML(Unified Modeling Language)是统一建模语言,1997年11月UML1.1版本提交给OMG并正式通过,成为建模语言的个那个也标准.2003年6 ...

  4. Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...

  5. UML类图与面向对象设计原则

    1. 引言     从大一开始学习编程,到如今也已经有两年了.从最初学习的Html,Js,JaveSe,再到JavaEE,Android,自己也能写一些玩具.学习过程中也无意识的了解了一些所谓的设计模 ...

  6. 【OOAD】面向对象设计原则概述

    软件的可维护性和可复用性 知名软件大师Robert C.Martin认为一个可维护性(Maintainability) 较低的软件设计,通常由于如下4个原因造成: 过于僵硬(Rigidity)  ...

  7. 面向对象设计原则OO

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...

  8. (转)Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...

  9. Java程序员应当知道的10个面向对象设计原则

    面向对象设计原则是OOPS编程的核心, 但我见过的大多数Java程序员热心于像Singleton (单例) . Decorator(装饰器).Observer(观察者) 等设计模式,而没有把足够多的注 ...

随机推荐

  1. Jquery 操作页面中iframe自动跟随窗口大小变化,而页面不出现滚动条,只在iframe内部出滚动条

    很多时候大家需要iframe自适应所加载的页面高度而不要iframe滚动条,但是这次我需要的是页面不需要滚动条而iframe要滚动条,且iframe自动跟随窗口大小变化.自适应页面大小.下面是代码,下 ...

  2. RAID对硬盘的要求及其相关

    Raid 0:至少需要两块硬盘,磁盘越多,读写速度越快,没有冗余. Raid 1:只能用两块硬盘,两块硬盘的数据互为镜像(写慢,读快),一块磁盘冗余. Raid 5:至少需要3块硬盘,一块磁盘冗余. ...

  3. ruby中实例变量、类变量等等的区别和联系

    ruby的变量有局部变量,全局变量,实例变量,类变量,常量. 1.局部变量 局部变量以一个小写字母开头或下划线开头 局部变量有局部作用域限制(比如一个block内),它的作用域起始于声明处,结束于该声 ...

  4. [Mac]Mac中显示资源库文件夹

    在 Mac OS X 10.7 Lion 之后的版本中 , 用户的个人目录内的资源库文件默认是隐藏状态. 这个设定可能是为了避免用户误操作. 但是对于中高级用户来说会有些不变. 通过如下方式可以找回被 ...

  5. OC:copy 与 retain 的区别

    copy与retain的区别: copy是创建一个新对象,retain是创建一个指针,引用对象计数加1.Copy属性表示两个对象内容相同,新的对象retain为1 ,与旧有对象的引用计数无关,旧有对象 ...

  6. contentWindow 和contentDocument区别 及iframe访问

    a>contentWindow 兼容各个浏览器,可取得子窗口的 window 对象. b>contentDocument Firefox 支持,> ie8 的ie支持.可取得子窗口的 ...

  7. 如何判断js中的数据类型(转)

    如何判断js中的数据类型:typeof.instanceof. constructor. prototype方法比较 如何判断js中的类型呢,先举几个例子: var a = "iamstri ...

  8. Winform XiaoCai.WinformUI 框架界面设计

    开源用户界面和布局的套件XiaoCai.WinformUI(美化用户界面利器) http://www.cnblogs.com/aganqin/p/3400453.html 源码下载:https://g ...

  9. 广州项目实施步骤I_练习安装 CentOS x64 6.4

    安装Centos x64 6.4 在家里使用 Vmware10.0.1进行模拟安装. 永久KEY注册密钥:5F29M-48312-8ZDF9-A8A5K-2AM0Z  下载地址:http://pan. ...

  10. C# 多线程处理相关说明: WaitHandle,waitCallback, ThreadPool.QueueUserWorkItem

    class TestThread { static void Main() { //使用WaitHandle静态方法阻止一个线程,直到一个或多个同步对象接收到信号 WaitHandle[] waitH ...