大话设计模式C++版——原则和引言

转贴请注明转自:http://blog.csdn.net/gufeng99/article/details/45832711

读程杰的《大话设计模式》有一段时间了,将其C#版的设计模式代码用C++全部重新实现了一遍,并记下个人的一些心得,同时也对一些设计模式进行了改造。网上有份《大话设计模式实现(C++版)》的资料,但稍看后错误不少,比如用作接口的基类不将析构函数申明为虚函数,仅内部使用的成员变量不申明为private(公然违背迪米特法则),new出的对象不进行释放等等一些错误或不良编码习惯,易误导新学C++的同学。故我将我个人实现的C++献丑放出,欢迎大家批评指正,共同进步。

1、单一职责原则

一个类只干一件事情,或者一类事情,功能要单一,就如只有照相功能的照相机,照相的效果肯定牛B过功能齐全的手机。

2、开放——封闭原则

函数、类、模块应该可以扩展,但不可以修改,修改会导致使用它们的老用户无法适应甚至出错。就如国外的大片,本来只有英文字幕,但国内的同学们也要欣赏欣赏腐朽的资本主义文化,但又总不能和老美说:“给哥统统换上中文的,还得加上拼音”(修改),即使老美被伟大的社会主义所震慑,统统换成中文的,但老美的乡亲们估计又要造反了,所以只能靠国内的字幕组同学辛苦辛苦给外挂上中文字幕(扩展),组成大家喜乐见闻的中英文字幕。

微软的windows系统在此法则上就有非常典型的应用,如常用启动进程的API——ShellExecute,因为不能控制启动后的进程,而添加了ShellExecuteEx函数,同时保留ShellExecute给默默做了多年贡献的老同志使用,这样就少了很多的兼容问题。

3、里氏代换原则

子类必须能够替换掉他们的父类,即老鼠的儿子肯定要会打洞,如果不会打洞那就是和隔壁老王生的了。但父类不一定能够替代子类,即儿子学会了调戏猫咪汤姆,但老子见了还是照样得脚底抹油。

4、依赖倒转原则

高层模块不应依赖底层模块,高层和底层都应依赖抽象,针对接口编程,不要对实现编程。面向过程的编程理念中,会有高层依赖底层,但底层不能依赖高层的说法,就是党教育我们的,领导干部(高层)要依靠人民群众(底层)。但面向对象的编程中,就变成了领导干部和人民群众都要依赖于法律(抽象规范),要依法治国。

5、迪米特法则

5.1、每一个类都应该尽量降低成员的访问权限,外界不需要的方法和成员变量都应申明为private。即自己的秘密就让它烂在心里,别一天到晚逮着人就说我有一个大秘密——”我是个傻X“。

5.2、如果2个类不必彼此直接通信,那么这2个类就不应当直接有相互调用或引用,如果确实需要调用,则需通过中间人进行转达。如大家(类1)去发快递,只要把快递给快递公司(中间人)就好了,而不用看那个快递员长得帅就指定那个快递员(类2)帮你去送这封快递。

************************************************************************************************************************************************************

以下是个人总结的一些规则

6、界面和逻辑分离

充气娃娃(逻辑)可以穿女仆装(界面1)装可爱,也可以穿空姐服(界面2)玩制服诱惑,如果无良卖家硬将充气娃娃和女仆装用502粘在一起(界面逻辑合体),估计广大空姐控,护士控屌丝要将差评刷上淘宝首页了。

7、不要将成员变量直接暴露,而通过成员函数来返回或修改

因为类的成员变量是可能会被删除的,同时外部也可直接改动成员变量,造成无法控制的后果。就如开银行,大家要贷款(成员变量:钱),ok,没问题,办贷款手续(成员函数),通过柜台MM把钱给用户。如果大家直接到金库里去拿钱(直接取成员变量),还嚷嚷说哥是来借钱的,估计警察叔叔的子弹会不答应的,即使大家诚实守信,拿了会还,但也总会有人会搬空了金库还拉坨大便改善改善空气。

8、代码重复或改动频繁时,需考虑设计模式

虽然说设计模式好,设计模式棒,但也不是必须天天用,处处使,设计的时候能预计以后需求使用合适的设计模式最好,但若不能,则可先做出demo,在后续需求改变,或代码迭代的过程,如果发现有重复或类似的代码、类或系统频繁的内部改动,则需要考虑设计模式进行重构了。

时间: 2024-10-07 14:06:01

大话设计模式C++版——原则和引言的相关文章

大话设计模式C++版——工厂方法模式

工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览<大话设计模式C++版--简单工厂模式>.在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发-封闭原则,其主要原因是由于switch的判断结构的使用,使修改或添加新的对象时需要改动简单工厂类的代码,不符合开放-封闭原则,那么工厂方法模式会在那方面有所改进呢?我们仍以简单工厂模式中加减法计算器为例. 1.保持简单工厂模式的 IOperation 接口和实现对象(COperation_Add 和 COperation_

大话设计模式C++版——抽象工厂模式

前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种--抽象工厂模式(Abstract Factory),其是在工厂方法模式的基础上改进而来,如果没有弄明白工厂方法模式的同学请先观看<大话设计模式C++版--工厂方法模式>. 为什么会有抽象工厂模式?抽象工厂模式是简单工厂模式缺陷的终极解决方式么?NO,抽象工厂模式并不是为了解决简单工厂模式的缺陷而活着,它是因为有新的使命而诞生. 一个简单的例

大话设计模式C++版——简单工厂模式

简单工厂模式应该是所有设计模式中最简单,也最基础的一种模式,以下是一个简单的采用工厂模式写一个加减法的计算器. 1.抽象接口类--依赖倒转原则(高层和底层都要依赖于抽象,针对接口编程) class IOperation { public: IOperation() : m_nNuml(0), m_nNumr(0) {} virtual ~IOperation() {} virtual void SetNum(int nNuml = 0, int nNumr = 0) { m_nNuml = nN

大话设计模式C++版——工厂模式在COM中的典型应用

上篇<大话设计模式C++版--抽象工厂模式>中,我们拯救世界未遂,留下小小的遗憾,本篇中我们将给出一个解决方案--COM组件技术,同时也顺便扯扯工厂模式在COM组件技术中的应用. 工厂模式违背开放-封闭原则的根本原因在于对象的产生无法通过客户模块外的数据进行控制,如果我们能从xml.注册表.配置文件中写入一个类的名字,然后模块从中读出类名,并根据读出的类名创建对象,那不就和C#高大上的反射技术一样牛B哄哄了.非常幸运,微软的COM组件技术就提供了这么一个平台. 1.COM组件是神马 为了节约篇

大话设计模式C++版——表驱动法改造简单工厂

上回<大话设计模式C++版--简单工厂模式>中指出了简单工厂模式的缺陷,即违背了开发-封闭原则,其主要原因是由于switch的判断结构的使用,使修改或添加新的对象时需要改动简单工厂类的代码,如何改造switch结构,表驱动法就可以粉墨登场了. 表驱动法的介绍见<数据驱动编程之表驱动法>. 1.面向接口编程,先改造抽象接口类IOperation class IOperation { public: IOperation() : m_nNuml(0), m_nNumr(0) {} vi

大话设计模式C++版——代理模式

本篇开始前先发个福利,程杰的<大话设计模式>一书高清电子版(带目录)已上传至CSDN,免积分下载. 下载地址:http://download.csdn.net/detail/gufeng99/8843487 代理模式是一种比较简单但却实用的设计模式,他可以灵活的更换代理的对象,但保证功能的完整性,就如卖衣服的代理商,他可以代理美特斯邦威的衣服,如果美特斯邦威的衣服被大家吐槽不好卖了,他还可以换去代理卖佐丹奴的,但不管怎么更换,还是能满足大家的需求--买衣服. 下面以大话设计模式书中的例子为例,

大话设计模式C++版——观察者模式

观察者模式是一种类似于消息分发的模式,用于一个任务需要被多个对象监听的场景,或者成员对象需要反向通知类对象的情况,是一种很有用的设计模式. 这里以大话设计模式中的例子为例,办公室员工A.B.C在看股票看电影,这时老板回来了,被A.B.C重金贿赂后的前台MM发出通知给A.B.C,A.B.C收到通知后赶紧关电脑,关股票窗口,装作在干活. 1.观察者接口 class IObserver { public: virtual ~IObserver() {} virtual void OnEvent(TSt

大话设计模式C++版——装饰模式

女人常说男人喜新厌旧,只见新人笑,那闻旧人哭,但装饰模式(Decorator)却是一种结交新朋友不忘老朋友的设计模式,非常适合去古代当老公(现代是不行的,因为只能娶一个老婆了).装饰模式的本质是每一个装饰对象都被保留一个被其装饰的对象,装饰对象在展示新功能时会同时去调用被其装饰的对象的同功能函数,通过如此层层包含调用(即装饰),形成一个类似链表的结构,接下来的介绍中,我们还会看到更多的类似链表结构的设计模式,比如职责链模式.状态模式. 仍以<大话设计模式>一书中装饰模式的小菜穿衣的例子为例,来

《大话设计模式》——六大原则

谈到设计模式,它是骨灰级任务给我们总结的经验,也是我们对面向对象编程学习的深入.而设计模式中的六大原则,则是我们在学习它时要遵循的规则.下面宏观的看一看六大原则的导图吧! 一.导图分析 二.导图分析 1.单一职责:就一个类而言,应该仅有一个引起它变化的原因. 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障. 解决方案:遵循单一职责原则.分别建立两个类T1.T2,使T1完成职责P1功能,T2完成职责P