成长的烦恼:进一步理解设计模式
日期:2007年5月3日 作者: 查看:[大字体 中字体 小字体]-
又一年……
镜头切换……
因为小王平时的出色表现,现在小王也是小小的项目经理了。而身边又多了一本书《重构:改善改善既有代码的设计》。排序的算法也相对稳定下来,排序也成为一个独立的模块,很多的地方中都使用到了。然而需求又变了,说要使用冒泡排序算法。“我的天啊,为何不早说呢?现在这么多地方都用到了。”小王查找了一下,总共有15处使用了相同的代码。代码的腐臭味。“以后还要增加,怎么办?以后还要换排序算法怎么办?”毕竟现在的小王不是以前的水平了,遇到问题都会三思而后行。一个声音在呼唤:“用工厂方法(Factory Method)吧。”长痛不如短痛,对代码进行重构。UML图如下:
(图片较大,请拉动滚动条观看)
在客户端程序一开始就初始化工厂:
CSortFactory* pSortFactory = new CBubbleSortFactory;
然后把所有调用的地方改成如下的代码:
CSort *pSort = pSortFactory->Create();
CCompareType *pType = new CNameCompare;
pSort->SetType(pType);
pSort->Sort(pList);
化了半个小时,把15处地方都修改过来。这样做的好处你知道了吗?以后如果发展到50处地方使用,难道你还一处一处去修改吗?Keep in your mind,需求是不断变化的。现在如果要改算法,只要修改一处就行,就是把CBubbleSortFactory替换掉。
这样真的彻底地解决问题了吗?掌握主动权就是掌握了命运。经过三年的磨练,小王处处长了个心眼,防患与未然。
这里有一个不稳定的因素就是Compare Type,难道它不会变化了?其实上面的代码应该是这样的:
CSort *pSort = pSortFactory->Create();
if(nType == SortName)
CCompareType *pType = new CNameCompare;
else if(nType == SortDate)
CCompareType *pType = new CDateCompare;
else
CCompareType *pType = new CSizeCompare;
pSort->SetType(pType);
pSort->Sort(pList);
小王不能容忍这种隐患,使用一个简单工厂模式(Simple Factory)吧。“发现变化,封装它。”UML图如下:
(图片较大,请拉动滚动条观看)
把if-else,switch移到CSimpleCompareFactory的Create函数中去吧。在客户端程序初始化代码加上一句:
CSimpleCompareFactory *pSimpleFactory = new CSimpleCompareFactory;
调用地方的代码改为:
- [1] [2] 下一页
-
- 成长的烦恼:进一步理解设计模式 相关文章:
- ·成长的烦恼:进一步理解设计模式
- 成长的烦恼:进一步理解设计模式 相关软件
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
上一篇:正则表达式从入门到精通
下一篇:游戏外挂设计技术探讨
精品推荐
热点TOP10
- ·BPEL模型基础
- ·Fedora 8下Apache配置与管理
- ·兵之利器 软件开发辅助工具纵览
- ·多核时代对并发程序设计的探索
- ·Enterprise Web 2.0--SOA的最后一英里
- ·BPEL的基本活动介绍
- ·DB2数据库归档日志的管理方案
- ·Web开发时碰到的问题以及心得经验
- ·基于Struts技术的Web层应用设计和实现
- ·四种网络游戏外挂的设计方法
- ·对一个加锁的表进行解锁
- ·开发WDM型的USB设备驱动程序
- ·软件架构设计的三个维度
- ·什么叫面向接口编程
- ·RPG游戏引擎的设计原理
- ·6.1.2 数据仓库的概念
- ·6.1.1 数据仓库的产生
- ·6.1 数据仓库概论
- ·5.1 Web服务概述
- ·3.7 面向对象编程的基本概念
