摘要: 序言 昨天学习了抽象工厂模式,所谓的抽象工厂模式,是为了应对产品线升级和隔离平台差异使用的设计模式。具体请参照博主上一篇博客。 今天要学习的是模板方法模式,可以说,这个模式太简单了,非常简单,你只需瞥一眼就能知道它的真谛,它的精髓。一言以蔽之。 正文 1. 定义定义一个操作中的算法的框架,而将一些步骤延迟到子类,使得子类可以不改变现有算法的结构即可重定义该算法的某些特定步骤。 用通俗的话来讲,举个例子,诸葛亮在指挥一场战役的时候,注意,是战役,战役是有很多场小战斗组成的。亮哥在谋划一场战役的时候,肯定是说:马谡,你守第一关;魏延,你守第二关;关羽,你守第三关;赵子龙,你守第四关。我们把马谡.. 阅读全文
posted @ 2012-10-30 23:37 邵贤军 阅读(1250) 评论(1) 推荐(1) 编辑
摘要: 1. 現実场景 在很多电影电视剧里,武功最高的往往是太监,所谓“欲练此功,必先自宫”,太监的武功为什么会这么高?我想应该是闲的。如果说面向对象的世界里有父子的话,那么太监这个类应该就是无法生子的类。他们是无法被继承的,不过,他们是可以继承别人的。 2. 技術問題 要实现一个无法被继承的类,Java为我们提供了一个关键字final,但是C++里没有,那作为C++程序员如何写出一个无法被继承的类呢?构造函数和析构函数。 为什么C++的构造函数和析构函数能够实现这点呢?因为C++的类继承里有一个规则,就是子类在实例化的时候,必须先调用父类的构造函数。对象销毁的时候,也必须调用父类的析构函数。... 阅读全文
posted @ 2012-10-30 21:52 邵贤军 阅读(1289) 评论(6) 推荐(0) 编辑
摘要: 悲剧,编辑的时候弄丢了,还能找回来啊?? 序言 昨天学习了抽象工厂模式,所谓的抽象工厂模式,是为了应对产品线升级和隔离平台差异使用的设计模式。具体请参照博主上一篇博客。 今天要学习的是模板方法模式,可以说,这个模式太简单了,非常简单,你只需瞥一眼就能知道它的真谛,它的精髓。一言以蔽之。 正文 1. 定义定义一个操作中的算法的框架,而将一些步骤延迟到子类,使得子类可以不改变现有算法的结构即可重定义该算法的某些特定步骤。 用通俗的话来讲,举个例子,诸葛亮在指挥一场战役的时候,注意,是战役,战役是有很多场小战斗组成的。亮哥在谋划一场战役的时候,肯定是说:马谡,你守第一关;魏延,你守第二关;关羽,你. 阅读全文
posted @ 2012-10-29 23:57 邵贤军 阅读(1515) 评论(2) 推荐(2) 编辑
摘要: 序言 《设计模式之禅》看到第78页了,继续坚持啊!作为一个创建型的设计模式,工厂方法模式被使用到的频率相当高,因此,这个模式的学习那是相当有价值的。那么,这个模式的定义是怎样的呢?这个模式的实现是怎样的呢?这个模式的作用是怎样的呢?笔者将尽一切可能为读者解释清楚,当然,如果没有解释清楚的,可以一起讨论。这样的学习才有互动性,才能不断进步嘛!元芳,你怎么看? 正文 1. 你是怎么创建对象的?(最蠢的方法)1 // 第一种2 MyObject mo;3 4 // 第二种5 MyObject *mo = new MyObject(); 靠,躺着也中枪!是的,我就是这么创建对象的啊!用什么创建什么.. 阅读全文
posted @ 2012-10-29 00:31 邵贤军 阅读(1617) 评论(4) 推荐(1) 编辑
摘要: 序言 今天开始学习23种设计模式的第一个模式——单例模式,以前在网上也看过不少人写的单例模式博文,也算已经吸收了不少。今天看《设计模式之禅》里对设计模式的讲解,作者说的还挺细致的。唯一可惜的是作者用java讲解单例模式,而我自己从去年工作后就用的是C++,本着学什么用什么的原则,我就用C++来记录一下学习成果吧。希望这篇博客能把我学到的分享给跟我一样在园子的读者。 正文1. 单例模式的现实场景 作者开篇用皇帝来类比单例,而我有个更好的例子,且听我一一道来。太阳系中有一个恒星和九大行星,至少我上学的时候是九大行星,后来因为冥王星太小了,被除名了。可是我还是觉得九这个数字比较好,比如九大行星,九. 阅读全文
posted @ 2012-10-27 23:24 邵贤军 阅读(2061) 评论(4) 推荐(2) 编辑
摘要: 序言 开闭是什么意思呢?显然这是两个词的合体,即开放和闭合的意思。那对什么开放呢?扩展。那有对什么闭合呢?修改。 软件开发最可怕的是什么?是变化。记得以前看过一个笑话,说一个程序员累昏倒了,在医院昏迷了好几天,家人哭的稀里哗啦的,老婆孩子在旁边怎么叫就是不醒。一天他同事来看他,第一句话就是对着躺在病床上的他说:需求又变了。奇迹发生了,那个程序员一下从病床上做起来了。 只是一个笑话而已,但是说明了变化对软件开发过程的影响,有些变化可能要修改逻辑,而有些变化甚至需要修改框架。总之,对于软件开发来说,变化是永恒不变的话题。 设计模式六大原则中的开闭原则是其他五种原则的高度概括,用作者的话来说,是精神 阅读全文
posted @ 2012-10-27 00:54 邵贤军 阅读(1563) 评论(5) 推荐(1) 编辑
摘要: 序言 记得一年前看设计模式的时候,走马观花,囫囵吞枣。每一个概念都没有去仔细想,只是知道某某设计模式能干什么事。今天看到【迪米特原则】倍感莫名其妙,你说你叫接口隔离原则吧,我可以一个词一个词的去解析;你说你叫单一职责吧,看名字我就能知道什么用。你非得叫个什么迪米特原则,让人莫名其妙,跟里氏替换原则差不多,不过里氏替换至少还有个替换二字。今天我们就来看看这个迪米特原则到底是个什么原则吧.正文 迪米特,英文demeter,网上说是天空之神跟时光女神的女儿,是丰产、农林女神。这个天空之神跟时光之神还有一个叫宙斯(第三代神王)的儿子和一个叫哈德斯(冥界之主神)的儿子。这个宙斯跟迪米特,也就是自己的二姐 阅读全文
posted @ 2012-10-26 00:01 邵贤军 阅读(1861) 评论(3) 推荐(1) 编辑
摘要: 序言 不得不说,我又看到一个比较坑爹的原则,因为它又是一个把一个类变两个,两个变四个的原则。在单一职责原则里,我们为了把不同的职责分开,把一个类抽象出了n个接口,本文的接口隔离原则又是一个抽象多接口的原则,我只能对天长叹:我不就是写个类嘛!你打算拆出多少接口出来啊? 那到底接口隔离原则抽象出来的接口跟单一职责抽象出来的接口有什么关系呢?接口隔离到底是一个什么概念呢?正文一、接口隔离的概念 要理解这个概念,首先,我们理解一下什么是接口。学过java的人,肯定很自然的说出来:interface定义的就是接口。是的,这是其中一种接口,我们叫做类接口。它是对类的抽象。 那么除了类接口还有其他接口吗?有 阅读全文
posted @ 2012-10-25 00:01 邵贤军 阅读(1806) 评论(2) 推荐(1) 编辑
摘要: 序言 我有一个习惯,每天早晨到公司9:00-10:00这个时间段我都边吃早餐,边在园子里看博客,吸取食物营养和知识营养。看了不少博客,有写的好的,有写的差的。有不少牛人贴一段精妙的代码放上去,有时有心情我会研究一下,有时却怎么也提不起兴致去看那么复杂的代码;有不少人写了满篇的文字,各种复杂逻辑的演算被揉在一起,看着很痛苦;当然也有好的,比如这两天搞的博客园鸡飞狗跳的“抢书事件”的"始作佣者"——汤姆大叔,他的博客写的条理很清楚,看着很舒服。 相信园子里大多数都是理工科的,这也不能怪,我写文章也是“剪不断,理还乱”那种。我这篇博客不是教谁谁怎么写博客,而是我自己的总结,希望能 阅读全文
posted @ 2012-10-25 00:00 邵贤军 阅读(2609) 评论(13) 推荐(5) 编辑
摘要: 芝姐学C++了,下午写了一段C++程序来学习C++语法,下面我们来看她写的代码:1 int *ptr = new int[4];2 *(ptr++) = 3;3 cout<<*ptr<<endl;4 5 delete[] ptr;首先,这段程序的输出是错误的,而且不能正确的运行成功,可疑的是,编译是完全没有错误的。下面是运行截图:上面的代码为什么会有错误呢?我们Debug一下,在第一行打上断点:1 int *ptr = new int[4]; ptr:0xcccccccc2 *(ptr++) = 3; ... 阅读全文
posted @ 2012-10-24 00:12 邵贤军 阅读(449) 评论(0) 推荐(0) 编辑
摘要: 序言 依赖倒置,这个概念看起来很玄乎,其实很简单。这也是我看所有技术书的心态,在心态上战胜这本书,那么它的内容,也就能很容易理解了。依赖倒置的英文定义如下: High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions。 英文不给力的自动跳过吧。这个原则的意思就是,代码要依赖于抽象,而不依赖于 阅读全文
posted @ 2012-10-23 23:47 邵贤军 阅读(1900) 评论(5) 推荐(1) 编辑
摘要: 1. 到官网下载最新的Python安装程序2. 双击安装包程序"python-2.7.3.msi" 3. 一路"Next>"到底,不过如果你需要更改安装目录的话,需要自己配置,下面是安装完成画面效果 4. 配置环境变量,将Python的安装目录加入到环境变量中去(我的是:C:\Python27) 5. 开始->运行->cmd->输入"python",成功进入Python运行环境,说明安装成功。6. 我们编写一个简单的python程序——Hello,World!看看运行效果 7. 下面就可以开始Python学习之 阅读全文
posted @ 2012-10-23 23:46 邵贤军 阅读(2938) 评论(0) 推荐(0) 编辑
摘要: 条款07:为多态基类声明virtual析构函数以前写过一篇给这个类似的,参考:[C++基础]023_为什么要将基类的析构函数声明为Virtual?核心内容类似。 阅读全文
posted @ 2012-10-22 23:15 邵贤军 阅读(194) 评论(0) 推荐(0) 编辑
摘要: 序言条款06:若不想使用编译器自动生成的函数,就应该明确拒绝 关于本条款,本人认为这样做的目的只有一点:意图:阻止你没有明确定义的功能流向客户手段:屏蔽C++偷偷为你的类提供的功能 比如“=”运算符是C++默默生成的,但是或许你根本不希望你的类可以这样赋值。比如默认构造函数,或许你根本不希望使用者那样构造你的对象。实现手段 要屏蔽C++偷偷为你提供的函数和运算符操作,可以有很多方法。但是作者提供的方法,我也觉得是最好的方法,是怎样好的呢?我们来看代码示例吧! 1 #include <iostream> 2 using namespace std; 3 4 class UnCopya 阅读全文
posted @ 2012-10-22 23:11 邵贤军 阅读(279) 评论(0) 推荐(0) 编辑
摘要: 序言本节作者用了很大的篇幅来阐述自己对里氏替换原则的理解,而且代码片段也相当翔实。笔者阅读该节之后,认为该节的核心内容可以归结如下:1. 里氏替换原则的定义2. 里氏替换原则的规范里氏替换原则的定义 里氏替换原则的定义有两种: 第一种(作者认为是最正宗的,但是却是理解起来稍微有点绕的)如果对于每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换为o2时,程序P的行为没有发生变化,那么类型S就是类型T的子类。 第二种(理解起来最方便的)所有使用基类的地方必须能透明的使用其子类的对象。里氏替换原则的规范1. 子类必须完全实现父类的方法2. 子类可以有自己 阅读全文
posted @ 2012-10-22 22:35 邵贤军 阅读(496) 评论(0) 推荐(0) 编辑