上一篇:成长的烦恼:初涉设计模式 >>
成长的烦恼:进一步理解设计模式
镜头切换……
因为小王平时的出色表现,现在小王也是小小的项目经理了。而身边又多了一本书《重构:改善改善既有代码的设计》。排序的算法也相对稳定下来,排序也成为一个独立的模块,很多的地方中都使用到了。然而需求又变了,说要使用冒泡排序算法。“我的天啊,为何不早说呢?现在这么多地方都用到了。”小王查找了一下,总共有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; |
调用地方的代码改为:
| CSort *pSort = pSortFactory->Create(); CCompareType *pType = pSimpleFactory ->Create(nSortName); pSort->SetType(pType); pSort->Sort(pList); |
“if-else,switch语句不是还在吗?”一个声音在问。
“怎么这么多问题?难道if-else,switch语句不能用吗?”有时不必强求,只要做到改动最小就行了,程序的代码在大部分情况下是能做修改的。
上面的设计已经能解决大部分的扩展的。
然而日子还在继续,客户还在提需求,小王还在继续自己的梦想。
下一篇:Java程序类加载完全揭密 >>
相关文章:
- · ASP.NET Atlas简单控件介绍之四大控件
- · ASP.NET页面中标题单点解决方案
- · ASP.NET2.0导航功能之配置会员和角色
- · 在ASP.NET程序中实现语音合成
- · ASP.NET入门随想之吸星大法
- · 抢先试用ASP.NET 2.0中的新型安全控件
- · ASP.NET入门随想六之大航海家
- · ASP.NET2.0应用中定制安全凭证之理论篇
- · ASP.NET2.0应用中定制安全凭证之实践篇
- · ASP.NET入门随想之抽象的力量
- · 一道Google中国挑战赛竞赛题的解法
- · ASP.NET入门随想之开卷有益
- · ASP.NET入门随想之瘦子与胖子的故事
- · .NET 2.0远程传输数据集的优化方法
- · 英特尔:对驱动程序软件漏洞没必要担忧
- · 苹果发布Mac OS升级版 修复60个软件瑕疵
- · 边走边看 手机应用软件开发平台介绍
- · Windows Mobile 5.0最新体验
- · 解读VC++编程中的文件操作API和CFile类
- · 利用VC++实现局域网实时视频传输
- · 使用VC6.0实现窗口的任意分割
- · 抢占网络工具焦点阵地 几大浏览器纷纷变脸
- · 双缓冲技术及其在VC的GDI环境下的实现
- · VC++实现动画弹出/弹入式窗口
- · VC++中实现以复杂线条为基础的图形绘图
- · VC++实现工具栏上添加平面组合框控件
- · C++箴言:考虑支持不抛异常的swap
- · Visual C++实现对计算机远程监控
- · VC与Matlab接口编程之Matcom安装配置
- · VC++中使用图形程序设计和动画技术
- · VC环境下三菱PLC与微机的串行通信
- · 在MFC下如何定义全局变量和全局函数
- · 用Visual C++实现排序算法大全
- · 辞旧迎新 WinFS未来的文件存储系统
- · Visual C++下对冒泡排序算法的改进
- · 系统变变变 Windows六则桌面应用技巧
- · 关于Windows系统待机、休眠的经典问答
- · Windows“高手”最常用的五个组合键
