设计模式之 面向对象的养猪厂的故事,C#演示(一)
对于设计模式, 从本质上说, 其最大的用途就是适应需求的变化. 因为有了设计模式,我们可以在设计阶段就为未来可能发生的变化留下足够的空间.
我们通过一个建造现代化养猪场的故事, 来讨论一下设计模式与需要变化之间的关系.
(一)设计模式最根本的意图是适应需求的变化
一个机器人研发小组研制了一种能自动喂猪的机器人, 于是有人投资兴建了一座由机器人管理的养猪场. 这个养猪场要饲养的猪的品种包括:
大白猪: 又叫"大约克郡猪", 原产于英国. 全身白色,耳向前挺立,体长大,成年公猪体重三百到五百公斤,繁殖力强, 是全世界分布最广的猪型.
长白猪: 是"兰德瑞斯猪" 在中国的统称. 著名的腌肉型猪, 原产于丹麦. 全身白色, 体躯 特长, 耳大前垂, 背腰平直, 大腿丰满. 皮薄瘦肉多.成年公猪体重四百到五百公斤, 要求较好的饲养管理条件.
波中猪: 是猪的著名品种, 原产于美国, 属脂肪型, 已培育成肉用型. 全身黑色.成年公猪重三百九十到四百五十公斤, 早熟易肥, 但繁殖力较弱.
下面我们来讨论机器人小组的设计方案:
图v1-1
用UML绘制的养猪场v1.0软件动作机制如图V1-1所示。最初的设计因为猪场只引进了大白猪品种,所以没有考虑饲养其它种类猪的情况。
一个喂猪机器人管理了若干头大白猪。由于猪天性懒惰,机器人必须把饲料放到猪嘴边,然后吆喝一句,“大白猪,吃!”,猪才会进食。
在v1.0版的程序动作下,养猪场运行状况相当不错,每头猪都养得膘肥休壮,如果不是企业要不断的追求剩余价值,我们的故事也许就到此结束了。
随着养猪场的蓬勃发展,养猪场老板决定进军国际市场。可是,不同地方的人喜欢吃不同品种的猪。为了适应这一需求的变化,养猪场新引进了一批长白猪。
问题出现了:喂猪机器人照例把饲料准备好,拿到每一头猪面前,大叫一声:”大白猪,吃!“,大白猪能像往常一样愉快地进食。但轮到长白猪时,长白猪无动于衷。这下急坏了养猪场的老板。为了解决问题,喂猪机器人的研发团队紧急出动,当晚便改好了程序。
V2.0 程序如图v2-1所示:
图v2-1
经过此次修改,喂猪机器人在对待每一头猪时,会先辩认出这头猪的类型,如果这是一头大白猪,它就会大叫一声”大白猪,吃!“,如果是一头长白猪,就叫”长白猪,吃“,经过这一个性,养猪场又恢复了平静。
可刚过了几天,类似的问题又再次出现,养猪场引进了几头波中猪!这下,机器人又不知道怎么喂了。研发团队又准备大动干戈、修改代码了。老板却对研发团队的做法表示不理解:“你们太不像话了,我是付了钱的,可每次我要扩大再生产的时候,你们都要耽误我好几天时间,重新修改什么代码,如果下次我要养鸡、养青蛙了呢?”
这个现代化养猪场出现的问题其实就是需求变化的问题。设计模式可以使系统很容易地在某一特定的层面上适应需求的变化。使用设计模式后,系统就可以很好的满足开闭原则:我们不用修改原来的代码,而只需要添加新的代码就可以满足新的需求了。
从这个角度来看,使用设计模式的关键是预测未来可能发生的需求变化,并在设计过程中选用合适的设计模式。同时,我们也应该将设计模式应用于系统中那些明显不稳定、极可能发生变化的部分,而不应该为了体验创造的乐趣,把设计模式应用于那些永远不会发生变化的组件中去。
例如,在养猪场系统中,当养猪场头一回引进新品种长白猪时,我们就敏锐立即认识到猪的种类是一种易变的因素,这时就必须引入设计模式以适应这种需求的变化。
从这里我们可总结出有关设计模式的第一个核心设计原则:
设计模式最根本的意图是适应需求的变化,我们应只对变化或者可能变化的部分使用设计模式,对于不变的部分滥用设计模式就会造成“过渡设计”。
(二) 针对接口编程,而不要针对实现编程
现在,我们来看一下如何改进这个现代化养猪场的设计,使其能最大限度地适应需求变化。
首先,我们应该际加一个猪的抽象接口,该接口中定义了每一类猪共有的行为,而大白猪和长白猪则具体实现这些行为。系统中的大白猪和长白猪满足完全替换原则,使用时客户不用考虑猪的具体类型,就可以直接通过抽象的猪的接口来操作具体的大白猪和长白猪对象。
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/61410.html
- 上一篇:rEFI引导Win10+Ubuntu14双系统
- 下一篇:VS一次删除多个窗体后报错