加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 大话设计模式

大话设计模式.pdf

大话设计模式

winer3086
2011-03-30 0人阅读 举报 0 0 暂无简介

简介:本文档为《大话设计模式pdf》,可适用于IT/计算机领域

作者:伍迷http:cjcnblogscomhttp:wwwcnblogscomcjarchivehtml整理:秦韶华作者:伍迷戏说面向对象程序设计C#版目录代序.............四大发明之活字印刷面向对象思想的胜利第一章............面试受挫代码无错就是好?第二章............代码规范、重构第三章............复制VS复用第四章............业务的封装第五章............体会简单工厂模式的美妙第六章............工厂不好用了?第七章............用“策略模式”是一种好策略第八章............反射程序员的快乐!第九章............会修电脑不会修收音机?聊设计模式原则第十章............三层架构分层开发第十一章...........无熟人难办事?聊设计模式迪米特法则第十二章...........有了门面程序员的程序会更加体面第十三章...........设计模式不能戏说!设计模式怎就不能戏说?四大发明之活字印刷面向对象思想的胜利话说三国时期曹操带领百万大军攻打东吴大军在长江赤壁驻扎军船连成一片眼看就要灭掉东吴统一天下曹操大悦于是大宴众文武在酒席间曹操诗性大发不觉吟道:“喝酒唱歌人生真爽。…………”。众文武齐呼:“丞相好诗!”于是一臣子速命印刷工匠刻版印刷以便流传天下。样张出来给曹操一看曹操感觉不妥说道:“喝与唱此话过俗应改为‘对酒当歌’较好!”于是此臣就命工匠重新来过。工匠眼看连夜刻版之工彻底白费心中叫苦不喋。只得照办。样张再次出来请曹操过目曹操细细一品觉得还是不好说:“人生真爽太过直接应改问语才够意境因此应改为‘对酒当歌人生几何?…………’!”当臣转告工匠之时工匠晕倒…………!可惜三国时期活字印刷还未发明所以类似事情应该时有发生如果是有了活字印刷。则只需更改四个字就可其余工作都未白做。实在妙哉。第一要改只需更改要改之字此为可维护第二这些字并非用完这次就无用完全可以在后来的印刷中重复使用此乃可复用第三此诗若要加字只需另刻字加入即可这是可扩展第四字的排列其实有可能是竖有可能是横排此时只需将活字移动就可做到满足排列需求此是灵活性好。而在活字印刷术之前上面的四种特性都无法满足要修改必须重刻要加字必须重刻要重新排列必须重刻印完这本书后此版已无任何可再利用价值。小时候我一直奇怪为何火药、指南针、造纸术都是从无到有从未知到发现的伟大发明而活字印刷仅仅是从刻版印刷到活字印刷的一次技术上的进步为何不是评印刷术为四大发明之一呢?做了软件开发几年后经历了太多的客户(曹操)改变需求更改最初想法的事件才逐渐明白当中的道理。其实客观的说客户的要求也并不过分(改几个字而已)但面对已完成的程序代码却是需要几乎重头来过的尴尬这实在是痛苦不堪。说白了原因就是因为我们原先所写的程序不容易维护灵活性差不容易扩展更谈不上复用因此面对需求变化加班加点对程序动大手术的那种无耐也就非常正常的事了。之后当我学习了面向对象分析设计编程思想开始考虑通过封装、继承、多态把程序的耦合度降低(传统印刷术的问题就在于所有的字都刻在同一版面上造成耦合度太高所制)开始用设计模式使得程序更加的灵活容易修改并且易于复用。体会到面向对象带来的好处那种感觉应该就如同是一中国酒鬼第一次喝到了茅台西洋酒鬼第一次喝到了XO一样怎个爽字可形容呀。再次回顾中国古代的四大发明另三种应该都是科技的进步伟大的创造或发现。而唯有活字印刷实在是思想的成功面向对象的胜利。不知您是否也有所感呢?第一章面试受挫代码无错就是好?小菜今年计算机专业大四了学了不少软件开发方面的东西也学着编了些小程序踌躇满志一心要找一个好单位。当投递了无数份简历后终于收到了一个单位的面试通知小菜欣喜若狂。到了人家单位前台小姐给了他一份题目上面写着“请用C、Java、C#或VBNET任意一种面向对象语言实现一个计算器控制台程序要求输入两个数和运算符号得到结果。”小菜一看这个还不简单三下五除二分钟不到小菜写完了感觉也没错误。交卷后单位说一周内等通知吧。于是小菜只得耐心等待。可是半个月过去了什么消息也没有小菜很纳闷我的代码实现了呀为什么不给我机会呢。小菜找到工作三年的师哥大鸟请教原因大鸟问了题目和了解了小菜代码的细节以后哈哈大笑说道:“小菜呀小菜你上当了人家单位出题的意思你完全都没明白当然不会再联系你了”。小菜说:“我的代码有错吗?单位题目不就是要我实现一个计算器的代码吗我这样写有什么问题。”classProgram{staticvoidMain(stringargs){ConsoleWrite("请输入数字A:")stringA=ConsoleReadLine()ConsoleWrite("请选择运算符号(、、*、):")stringB=ConsoleReadLine()ConsoleWrite("请输入数字B:")stringC=ConsoleReadLine()stringD=""if(B=="")D=ConvertToString(ConvertToDouble(A)ConvertToDouble(C))if(B=="")D=ConvertToString(ConvertToDouble(A)ConvertToDouble(C))if(B=="*")D=ConvertToString(ConvertToDouble(A)*ConvertToDouble(C))if(O=="")D=ConvertToString(ConvertToDouble(A)ConvertToDouble(C))ConsoleWriteLine("结果是:"D)}}小菜的代码有什么问题呢?第二章代码规范、重构大鸟说:“且先不说出题人的意思单就你现在的代码就有很多不足的地方需要改进。比如变量命名你的命名就是ABCD变量不带有任何具体含义这是非常不规范的判断分支你这样的写法意味着每个条件都要做判断等于计算机做了三次无用功数据输入有效性判断等如果用户输入的是字符符号而不是数字怎么办?如果除数时客户输入了怎么办?这些都是可以改进的地方。”“哦说得没错这个我以前听老师说过可是从来没有在意过我马上改改完再给你看看。”classProgram{staticvoidMain(stringargs){try{ConsoleWrite("请输入数字A:")stringstrNumberA=ConsoleReadLine()ConsoleWrite("请选择运算符号(、、*、):")stringstrOperate=ConsoleReadLine()ConsoleWrite("请输入数字B:")stringstrNumberB=ConsoleReadLine()stringstrResult=""switch(strOperate){case"":strResult=ConvertToString(ConvertToDouble(strNumberA)ConvertToDouble(strNumberB))breakcase"":strResult=ConvertToString(ConvertToDouble(strNumberA)ConvertToDouble(strNumberB))breakcase"*":strResult=ConvertToString(ConvertToDouble(strNumberA)*ConvertToDouble(strNumberB))breakcase"":if(strNumberB!="")strResult=ConvertToString(ConvertToDouble(strNumberA)ConvertToDouble(strNumberB))elsestrResult="除数不能为"break}ConsoleWriteLine("结果是:"strResult)ConsoleReadLine()}catch(Exceptionex){ConsoleWriteLine("您的输入有错:"exMessage)}}}大鸟:“吼吼不错不错改得很快吗?至在目前代码来说实现计算器是没有问题了但这样写出的代码是否合出题人的意思呢?”小菜:“你的意思是面向对象?”大鸟:“哈小菜非小菜也!”第三章复制VS复用小菜:“我明白了他说用任意一种面向对象语言实现那意思就是要用面向对象的编程方法去实现对吗?OK这个我学过只不过当时我没想到而已。”大鸟:“所有编程初学者都会有这样的问题就是碰到问题就直觉的用计算机能够理解的逻辑来描述和表达待解决的问题及具体的求解过程。这其实是用计算机的方式去思考比如计算器这个程序先要求输入两个数和运算符号然后根据运算符号判断选择如何运算得到结果这本身没有错但这样的思维却使得我们的程序只为满足实现当前的需求程序不容易维护不容易扩展更不容易复用。从而达不到高质量代码的要求。”小菜:“鸟哥呀我有点糊涂了如何才能容易维护容易扩展又容易复用呢能不能具体点?”大鸟:“比如说我现在要求你再写一个windows的计算器你现在的代码能不能复用呢?”小菜:“那还不简单把代码复制过去不就行了吗?改动又不大不算麻烦。”大鸟:“小菜看来还是小菜呀有人说初级程序员的工作就是CtrlC和CtrlV这其实是非常不好的编码习惯因为当你的代码中重复的代码多到一定程度维护的时候可能就是一场灾难。越大的系统这种方式带来的问题越严重编程有一原则就是用尽可能的办法去避免重复。想想看你写的这段代码有哪些是和控制台无关的而只是和计算器有关的?”第四章业务的封装小菜:“你的意思是分一个类出来?哦对的让计算和显示分开。”大鸟:“准确的说就是让业务逻辑与界面逻辑分开让它们之间的耦合度下降。只有分离开才容易达到容易维护或扩展。”小菜:“让我来试试看。”classProgram{staticvoidMain(stringargs){try{ConsoleWrite("请输入数字A:")stringstrNumberA=ConsoleReadLine()ConsoleWrite("请选择运算符号(、、*、):")stringstrOperate=ConsoleReadLine()ConsoleWrite("请输入数字B:")stringstrNumberB=ConsoleReadLine()stringstrResult=""strResult=ConvertToString(OperationGetResult(ConvertToDouble(strNumberA),ConvertToDouble(strNumberB),strOperate))ConsoleWriteLine("结果是:"strResult)ConsoleReadLine()}catch(Exceptionex){ConsoleWriteLine("您的输入有错:"exMessage)}}}publicclassOperation{publicstaticdoubleGetResult(doublenumberA,doublenumberB,stringoperate){doubleresult=dswitch(operate){case"":result=numberAnumberBbreakcase"":result=numberAnumberBbreakcase"*":result=numberA*numberBbreakcase"":result=numberAnumberBbreak}returnresult}}小菜:“鸟哥我写好了你看看!”大鸟:“哈孺鸟可教也:)写得不错这样就完全把业务和界面分离了。”小菜心中暗骂:“你才是鸟呢。”口中说道:“如果你现在要我写一个Windows应用程序的计算器我就可以复用这个运算类(Operation)了。”大鸟:“不单是Windows程序Web版程序需要运算可以用它PDA手机等需要移动系统的软件需要运算也可以用它呀。”小菜:“哈面向对象不过如此。下会写类似代码不怕了。”大鸟:“别急仅此而已实在谈不上完全面向对象你只用了面向对象三大特性的一个还两个没用呢?”小菜:“面向对象三大特性不就是封装、继承和多态吗这里我用到的应该是封装。这还不够吗?……我实在看不出这么小的程序如何用到继承。至于多态其它我一直也不太了解它到底有什么好处如何使用它。”大鸟:“慢慢来有的东西好学了你好好想想吧我要去“魔兽”了改时聊。”第五章体会简单工厂模式的美妙次日小菜再来找大鸟问道:“你昨天说计算器这样的小程序还可以用到面向对象三大特性?继承和多态怎么可能用得上我实在不可理解。”大鸟:“小菜很有钻研精神吗?好今天我让你功力加深一级。你先要考虑一下你昨天写的这个代码能否做到很灵活的可修改和扩展呢?”小菜:“我已经把业务和界面分离了呀这不是很灵活了吗?”大鸟:“那我问你现在如果我希望增加一个开根(sqrt)运算你如何改?”小菜:“那只需要改Operation类就行了在switch中加一个分支就行了。”大鸟:“问题是你要加一个平方根运算却需要把加减乘除的运算都得来参与编译如果你一不小心把加法运算改成了减法这不是大大的糟糕。打个比方如果现在公司要求你为公司的薪资管理系统做维护原来只有技术人员(月薪)市场销售人员(底薪提成)经理(年薪股份)三种运算算法现在要增加兼职工作人员的(时薪)算法但按照你昨天的程序写法公司就必须要把包含有的原三种算法的运算类给你让你修改你如果心中小算盘一打‘TMD公司给我的工资这么低我真是郁闷这会有机会了’于是你除了增加了兼职算法以外在技术人员(月薪)算法中写了一句if(员工是小菜){salary=salary*}那就意味着你的月薪每月都会增加(小心被抓去坐牢)本来是让你加一个功能却使得原有的运行良好的功能代码产生了变化这个风险太大了。你明白了吗?”小菜:“哦你的意思是我应该把加减乘除等运算分离修改其中一个不影响另外的几个增加运算算法也不影响其它代码是这样吗?”大鸟:“自己想去吧如何用继承和多态你应该有感觉了。”小菜:“OK我马上去写。”<summary>运算类<summary>classOperation{privatedoublenumberA=privatedoublenumberB=<summary>数字A<summary>publicdoubleNumberA{get{returnnumberA}set{numberA=value}}<summary>数字B<summary>publicdoubleNumberB{get{returnnumberB}set{numberB=value}}<summary>得到运算结果<summary><returns><returns>publicvirtualdoubleGetResult(){doubleresult=returnresult}}<summary>加法类<summary>classOperationAdd:Operation{publicoverridedoubleGetResult(){doubleresult=result=NumberANumberBreturnresult}}<summary>减法类<summary>classOperationSub:Operation{publicoverridedoubleGetResult(){doubleresult=result=NumberANumberBreturnresult}}<summary>乘法类<summary>classOperationMul:Operation{publicoverridedoubleGetResult(){doubleresult=result=NumberA*NumberBreturnresult}}<summary>除法类<summary>classOperationDiv:Operation{publicoverridedoubleGetResult(){doubleresult=if(NumberB==)thrownewException("除数不能为。")result=NumberANumberBreturnresult}}小菜:“大鸟哥我按照你说的方法写出来了一部分首先是一个运算类它有两个Number属性主要用于计算器的前后数然后有一个虚方法GetResult()用于得到结果然后我把加减乘除都写成了运算类的子类继承它后重写了GetResult()方法这样如果要修改任何一个算法都不需要提供其它算法的代码了。但问题来了我如何让计算器知道我是希望用哪一个算法呢?”大鸟:“写得很不错吗大大超出我的想象了你现在的问题其实就是如何去实例化对象的问题哈今天心情不错再教你一招‘简单工厂模式’也就是说到底要实例化谁将来会不会增加实例化的对象(比如增加开根运算)这是很容易变化的地方应该考虑用一个单独的类来做这个创造实例的过程这就是工厂来我们看看这个类如何写。”<summary>运算类工厂<summary>classOperationFactory{publicstaticOperationcreateOperate(stringoperate){Operationoper=switch(operate){case"":{oper=newOperationAdd()break}case"":{oper=newOperationSub()break}case"*":{oper=newOperationMul()break}case"":{oper=newOperationDiv()break}}returnoper}}大鸟:“哈看到吧这样子你只需要输入运算符号工厂就实例化出合适的对象通过多态返回父类的方式实现了计算器的结果。”Operationoperoper=OperationFactorycreateOperate("")operNumberA=operNumberB=doubleresult=operGetResult()大鸟:“哈界面的实现就是这样的代码不管你是控制台程序Windows程序Web程序PDA或手机程序都可以用这段代码来实现计算器的功能当有一天我们需要更改加法运算我们只需要改哪里?”小菜:“改OperationAdd就可以了。”大鸟:“那么我们需要增加各种复杂运算比如平方根立方根自然对数正弦余弦等如何做?”小菜:“只要增加相应的运算子类就可以了呀。”大鸟:“嗯?够了吗?”小菜:“对了还需要去修改运算类工厂在switch中增加分支。”大鸟:“哈那才对那如果要修改界面呢?”小菜:“那就去改界面呀关运算什么事呀。”小菜:“回想那天我面试题写的代码我终于明白我为什么写得不成功了原来一个小小的计算器也可以写出这么精彩的代码谢谢大鸟。”(下为当时面试题时小菜所写代码见《小菜编程成长记(一)》)Program{staticvoidMain(stringargs){ConsoleWrite("请输入数字A:")stringA=ConsoleReadLine()ConsoleWrite("请选择运算符号(、、*、):")stringB=ConsoleReadLine()ConsoleWrite("请输入数字B:")stringC=ConsoleReadLine()stringD=""if(B=="")D=ConvertToString(ConvertToDouble(A)ConvertToDouble(C))if(B=="")D=ConvertToString(ConvertToDouble(A)ConvertToDouble(C))if(B=="*")D=ConvertToString(ConvertToDouble(A)*ConvertToDouble(C))if(O=="")D=ConvertToString(ConvertToDouble(A)ConvertToDouble(C))ConsoleWriteLine("结果是:"D)}}大鸟:“吼吼记住哦编程是一门技术更加是一门艺术不能只满足于写完代码运行结果正确就完事时常考虑如何让代码更加简炼更加容易维护容易扩展和复用只有这样才可以是真的提高。写出优雅的代码真的是一种很爽的事情。不过学无止境其实这才是理解面向对象的开始呢。给你出个作业做一个商场收银软件营业员根据客户购买商品单价和数量向客户收费。”小菜:“就这个?没问题呀。”第六章关于Flex的争论?声明:本文略有广告之嫌不过写此文的初衷却是因为对上篇博客引发争议的感想所以看此文前不妨先看看上文的评论感谢您的阅读欢迎拍砖。几天后小菜跑到大鸟处说道:“大鸟哥今天看到一个网站叫妙句网是用来收藏好句子用的网站本身没什么太多希奇但它用的技术却是最近非常火的Flex技术作者说他也就学了不到两个月就做出了这个网站你说会不会是真的?如果真的是这样我也想学学毕竟做出来的效果比一般的网站真的要酷很多哦。”大鸟:“哦?让我来看看。”大鸟打开了浏览器键入了小菜说的网站。“嗯?怎么是flash的?”大鸟说。小菜点头道:“Flex其实就是开发出可以在FlashPlayer插件上运行的编程工具!你看它整个网站就是一个Flash开始下载是慢了点但下载好了大部分操作都不用再访问网络了局部的更新数据也只是局部刷新而已。你点这个登录哈登录就从上框跳出来还会抖动两下再看点这个‘Show’出来框后点‘播放’那个句子翻页的D效果是不是很酷?还有……”“Stop!停!”大鸟突然说道“你是来给我做广告来了?这种纯粹为炫点效果而做的网站我见得多了有什么希奇的。我虽然没做过Flash但开发这些年我还不知道?就象我没得过禽流感但感冒啥滋味我不会比鸡知道的少了。”“可是听说这技术很容易学用不了多久就可以上手做出漂亮的东西。你之前不是还整天跟我说AJAX太他妈麻烦JavaScript调试极度困难还要考虑跨浏览器等诸多问题写Ajax网站吃力不讨好吗?”“哈哈小菜呀小菜外行了吧。写这网站的人说是只学了Flex一个多月做出这东西我也相信他说的是真的但这里面有多少细节技术是你看不到的?我说几个细节给你听听比如注册Email如何验证?这用正则表达式判断最好你得懂才行哪怕上网查至少你要知道如何用吧。再比如这网站上的分页每页显示条信息如果把一千多条句子全下载不就傻了吗?可若每次换页只下载条这就得懂得如何写这样的Sql语句当然最好是存储过程。至于整个网站包括了从注册、登录、增删改句子到句子列表正文显示搜索查询这就是一整套的网站基本架构这些都是要技术积累的。”“啊这倒是真的正则表达式学过但还是不会用分页存储过程干脆就写不来要独立写个网站看来也的确是有难度的。”“不过这网站其实做了也没太大的用处。”大鸟说道“第一Flash占的系统资源太大你看我才点击tag查询我的CPU就我在放的MP声音都开始打抖了这真的很不爽。第二Flash是封装成swf文件下载的也就是说搜索引擎是根本找不到里面的数据里面的句子也就谈不上被搜索到。这样这些数据又如何能被大众用户查看到?”“咦我在家里好像感觉不到速度问题吗?哦我明白了因为我的笔记本是双核的最多也就占用看来硬件的提升也是促进软件的发展呀。不过搜索引擎好像是很难办有没有什么解决方案?”大鸟说:“搜索引擎对整站SWF的索引的问题目前没有什么完美的解决方法或许我们可以生成一个sitemap让搜索引擎的爬虫自己爬上来。”大鸟继续说道:“所以我说这种网站没什么太大用处Flex这种富客户端技术不过是个噱头罢了。”“唉大鸟我就不同意的你看法。”小菜有点激动“现在有了DVD你还会去小摊买SVCD看吗?现在有了Windows你还会去整天对着黑屏用Dos敲打命令行吗?富客户端可以做到更加好的客户感受度又不用安装和升级这结合CS和BS的优点于一身的好技术。”“小菜html是Internet的主流要客户感受度还是好好研究JavaScript的AJAX技术吧。”大鸟语重声长的说。“降龙十八掌固然强悍勇猛那是因为没有发明手枪赤兔固然是良驹那是因为关老儿没有宝马大奔。谁说html今天是主流就意味着未来是主流?我觉得AJAX有很大的局限性是一种过渡技术。未来一定是富客户端的天下。”“小菜别激动你说得也有道理。我举个例子你就会明白Flex或Flash以前是Macromedia现在上Adobe的主推的产品吧那我问你他们的官方网站是什么写的?”大鸟慢条斯理道。“这个……好像还是html”。小菜犹豫后答道。“你有想过为什么?还有那些Flex的技术网站比如博客呀论坛呀什么的我敢肯定的说一定不是用富客户端技术做的。”“是不是因为不好搜索?”小菜疑问中。“这是一方面吧其实文字信息很大的网站都不太适合这种技术的因为它要的不是过渡效果而是内容本身。如果内容不够好网站再漂亮也是没有用的而内容够好却没有人能找得到这些内容这内容也是价值不大的这也正是为什么连Adobe公司自己在发布网站时也用的是传统的html模式。”“是我理解你的意思就是说这种文字信息网站不适合但有些网站比如公司产品展示动漫游戏等才更适合是吗?”大鸟说:“当然还不只是这些Google推出一种理念就是要弱化客户端强化网络也就是说过去我们上网的习惯是下载把好的东西都下载到本地来现在要反过来。比如以前我们都是把Email收到本地不然网络信箱就会满而收不了信但这就带来了一个坏处你要是没有在这台机器旁你想看你以前的信就不可能了甚至操作系统崩溃后可能这些信就没了当然照片文档也是如此。现在呢最好的办法是把所有的信息都放在网络上比如Gmail里比如里或者什么网站硬盘里(最好是大公司)。只要有网络你想在什么地方用它都行。”“明白同样道理我现在看到的在线Office、在线WebOS、在线图片处理等应用都是Flex的应用也就是说以后这些都不需要操作系统里安装什么软件了。”“哈小菜开窍了这样操作系统的功能就下降了以前要听音乐看电影都需下载现在都是在线听以前游戏都是在家独自玩现在都网游现在聊天都QQMSN将来都WebIM总有一天客户端会只是一个类似浏览器的东东就行的不只是电脑手机家电都能上Internet那才是未来发展的方向。不过你知道吗?真这样的话谁最不开心?”“嗯?谁会不开心?这不是大家都好吗?”“哈当然是微软最不开心因为他们是卖操作系统的呀操作系统功能越来越弱化了他们的市场不就小了吗?所以同样是推出富客户端应用(WPF和Flex)微软和Adobe的想法是不一样的微软是希望和操作系统连接更紧密而Adobe或Google却是希望客户端越简单越好。”“大鸟呀你说话前后矛盾的刚才还在和我说‘Flex这种富客户端技术不过是个噱头罢了’现在又在大谈富客户端的好你到底是什么意思?”“咱们领袖毛老人家说过看问题要用辩证法事物都有两面性。富客户端有好的方面当然也存在着不足现在这技术还不够成熟至少在以文字内容为主的网站这种技术还是没太大的用处所以妙句网只是一个噱头不能成大气候。”“我却觉得新事物总会有人说不好的妙句这个创意本身很好用这个技术也感觉和一般网站不一样只不过现在刚开始还没有发挥Flex的特性吧听说AJAX和Flex可以直接通讯的或许和html结合一下句子能被搜索引擎找到加上性能优化后让客户端CPU压力不太大我相信它会越来越好起来。我决定了我也要学Flex做一个贼酷的富客户端网站。”“得了吧你”大鸟说道“你还是好好打好基础上会你写完计算器的程序后面我留的作业你做了没有就是做一个商场收银软件营业员根据客户购买商品单价和数量向客户收费。”“啊我忘记了那个没什么大问题我尽快去写。”第七章工厂不好用了?小菜心里想:“大鸟要我做的是一个商场收银软件营业员根据客户购买商品单价和数量向客户收费。这个很简单两个文本框输入单价和数量再用个列表框来记录商品的合计最终用一个按钮来算出总额就可对还需要一个重置按钮来重新开始不就行了?!”代码样例(可使用):商场收银系统v关键代码如下:声明一个double变量total来计算总计doubletotal=dprivatevoidbtnOkClick(objectsender,EventArgse){声明一个double变量totalPrices来计算每个商品的单价(txtPrice)*数量(txtNum)后的合计doubletotalPrices=ConvertToDouble(txtPriceText)*ConvertToDouble(txtNumText)将每个商品合计计入总计total=totaltotalPrices在列表框中显示信息lbxListItemsAdd("单价:"txtPriceText"数量:"txtNumText"合计:"totalPricesToString())在lblResult标签上显示总计数lblResultText=totalToString()}“大鸟”小菜叫道“来看看这不就是你要的收银软件吗?我不到半小时就搞定了。”“哈哈很快吗”大鸟说着看了看小菜的代码。接着说:“现在我要求商场对商品搞活动所有的商品打折。”“那不就是在totalPrices后面乘以一个吗?”“小子难道商场活动结束不打折了你还要再把程序改写代码再去把所有机器全部安装一次吗?再说我现在还有可能因为周年庆打五折的情况你怎么办?”小菜不好意思道:“啊我想得是简单了点。其实只要加一个下拉选择框就可以解决你说的问题。”大鸟微笑不语。商场收银系统v关键代码如下:doubletotal=dprivatevoidbtnOkClick(objectsender,EventArgse){doubletotalPrices=dcbxType是一个下拉选择框分别有“正常收费”、“打折”、“打折”和“打折”switch(cbxTypeSelectedIndex){case:totalPrices=ConvertToDouble(txtPriceText)*ConvertToDouble(txtNumText)breakcase:totalPrices=ConvertToDouble(txtPriceText)*ConvertToDouble(txtNumText)*breakcase:totalPrices=ConvertToDouble(txtPriceText)*ConvertToDouble(txtNumText)*breakcase:totalPrices=ConvertToDouble(txtPriceText)*ConvertToDouble(txtNumText)*break}total=totaltotalPriceslbxListItemsAdd("单价:"txtPriceText"数量:"txtNumText""cbxTypeSelectedItem"合计:"totalPricesToString())lblResultText=totalToString()}“这下可以了吧只要我事先把商场可能的打折都做成下拉选择框的项要变化的可能性就小多了。”小菜说道。“这比刚才灵活性上是好多了不过重复代码很多像ConvertToDouble()你这里就写了遍而且个分支要执行的语句除了打折多少以外几乎没什么不同应该考虑重构一下。不过还不是最主要的现在我的需求又来了商场的活动加大需要有满返的促销算法你说怎么办?”“满返那要是就要返了?这个必须要写函数了吧?”“小菜呀看来之前教你的白教了这里面看不出什么名堂吗?”“哦!我想起来了你的意思是简单工厂模式是吧对的对的我可以先写一个父类再继承它实现多个打折和返利的子类利用多态完成这个代码。”“你打算写几个子类?”“根据需求呀比如折、折、折、满送、满送……要几个写几个。”“小菜又不动脑子了有必要这样吗?如果我现在要折我要满送你难道再去加子类?你不想想看这当中哪些是相同的哪些是不同的?”“对的这里打折基本都是一样的只要有个初始化参数就可以了。满几送几的需要两个参数才行明白现在看来不麻烦了。”“面向对象的编程并不是类越多越好类的划分是为了封装但分类的基础是抽象具有相同属性和功能的对象的抽象集合才是类。打一折和打九折只是形式的不同抽象分析出来所有的打折算法都是一样的所以打折算法应该是一个

用户评价(4)

  • 今日之星 这本书也太简练了吧...

    2013-03-31 23:15:07

  • 今日之星 这本书也太简练了吧...

    2013-03-31 23:14:42

  • 今日之星 这本书也太简练了吧...

    2013-03-31 23:12:49

  • 114.249.239.98 这个就是 设计模式 书中最畅销的,最通俗易懂的,给初学者的一本好书,遗憾的是不全,没看不要乱说

    2012-02-15 18:37:36

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/12

大话设计模式

仅供在线阅读

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利