收藏 分享(赏)

大话设计模式.pdf

上传人:HR专家 文档编号:6297243 上传时间:2019-04-05 格式:PDF 页数:61 大小:1.33MB
下载 相关 举报
大话设计模式.pdf_第1页
第1页 / 共61页
大话设计模式.pdf_第2页
第2页 / 共61页
大话设计模式.pdf_第3页
第3页 / 共61页
大话设计模式.pdf_第4页
第4页 / 共61页
大话设计模式.pdf_第5页
第5页 / 共61页
点击查看更多>>
资源描述

1、作者:伍迷 http:/http:/ 作者:伍迷 戏说面向对象程序设计 版 目 录 代序四大发明之活字印刷面向对象思想的胜利 第一章面试受挫代码无错就是好? 第二章代码规范、重构 第三章复制VS复用 第四章业务的封装 第五章体会简单工厂模式的美妙 第六章工厂不好用了? 第七章用“策略模式”是一种好策略 第八章反射程序员的快乐! 第九章会修电脑不会修收音机?聊设计模式原则 第十章三层架构,分层开发 第十一章无熟人难办事?聊设计模式迪米特法则 第十二章有了门面,程序员的程序会更加体面 第十三章设计模式不能戏说!设计模式怎就不能戏说? 1四大发明之活字印刷 面向对象思想的胜利 话说三国时期,曹操带领

2、百万大军攻打东吴,大军在长江赤壁驻扎,军船连成一片,眼看就要灭掉东吴,统一天下,曹操大悦,于是大宴众文武,在酒席间,曹操诗性大发,不觉吟道: “喝酒唱歌,人生真爽。 ”。众文武齐呼: “丞相好诗!” 于是一臣子速命印刷工匠刻版印刷,以便流传天下。 样张出来给曹操一看,曹操感觉不妥,说道: “喝与唱,此话过俗,应改为 对酒当歌 较好! ”,于是此臣就命工匠重新来过。工匠眼看连夜刻版之工,彻底白费,心中叫苦不喋。只得照办。 样张再次出来请曹操过目,曹操细细一品,觉得还是不好,说:“ 人生真爽太过直接,应改问语才够意境,因此应改为 对酒当歌,人生几何? !” 当臣转告工匠之时,工匠晕倒! 可惜三国时

3、期活字印刷还未发明,所以类似事情应该时有发生,如果是有了活字印刷。则只需更改四个字就可,其余工作都未白做。实在妙哉。 2第一,要改,只需更改要改之字,此为 可维护 ;第二,这些字并非用完这次就无用,完全可以在后来的印刷中重复使用,此乃 可复用 ;第三,此诗若要加字,只需另刻字加入即可,这是 可扩展 ;第四,字的排列其实有可能是竖有可能是横排,此时只需将活字移动就可做到满足排列需求,此是 灵活性好 。 而在活字印刷术之前,上面的四种特性都无法满足,要修改,必须重刻,要加字,必须重刻,要重新排列,必须重刻,印完这本书后,此版已无任何可再利用价值。 小时候,我一直奇怪,为何火药、指南针、造纸术都是从

4、无到有,从未知到发现的伟大发明,而活字印刷仅仅是从刻版印刷到活字印刷的一次技术上的进步,为何不是评印刷术为四大发明之一呢? 做了软件开发几年后,经历了太多的客户(曹操)改变需求,更改最初想法的事件,才逐渐明白当中的道理。其实客观的说,客户的要求也并不过分(改几个字而已),但面对已完成的程序代码,却是需要几乎重头来过的尴尬,这实在是痛苦不堪。说白了,原因就是因为我们 原先所写的程序,不容易维护,灵活性差,不容易扩展,更谈不上复用,因此面对需求变化,加班加点,对程序动大手术的那种无耐也就非常正常的事了 。 之后当我学习了面向对象分析设计编程思想,开始考虑 通过封装、继承、多态把程序的耦合度降低 (

5、传统印刷术的问题就在于所有的字都刻在同一版面上造成耦合度太高所制),开始 用设计模式使得程序更加的灵活,容易修改,并且易于复用 。体会到面向对象带来的好处,那种感觉应该就如同是一中国酒鬼第一次喝到了茅台,西洋酒鬼第一次喝到了XO一样,怎个爽字可形容呀。 再次回顾中国古代的四大发明,另三种应该都是科技的进步,伟大的创造或发现。而唯有活字印刷,实在是思想的成功,面向对象的胜利。不知您是否也有所感呢? 3第一章 面试受挫代码无错就是好? 小菜今年计算机专业大四了,学了不少软件开发方面的东西,也学着编了些小程序,踌躇满志,一心要找一个好单位。当投递了无数份简历后,终于收到了一个单位的面试通知,小菜欣喜

6、若狂。 到了人家单位,前台小姐给了他一份题目,上面写着,“ 请用C+ 、Java 、C# 或 VB.NET任意一种面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果。” 小菜一看,这个还不简单,三下五除二, 10分钟不到,小菜写完了,感觉也没错误。交卷后,单位说一周内等通知吧。于是小菜只得耐心等待。可是半个月过去了,什么消息也没有,小菜很纳闷,我的代码实现了呀,为什么不给我机会呢。 小菜找到工作三年的师哥大鸟,请教原因,大鸟问了题目和了解了小菜代码的细节以后,哈哈大笑,说道:“ 小菜呀小菜,你上当了,人家单位出题的意思,你完全都没明白,当然不会再联系你了” 。 小菜说:

7、“我的代码有错吗?单位题目不就是要我实现一个计算器的代码吗,我这样写有什么问题。” class Program static void Main(string args) Console.Write(“请输入数字A:“); string A = Console.ReadLine(); Console.Write(“请选择运算符号(+、-、*、/):“); string B = Console.ReadLine(); Console.Write(“请输入数字B:“); string C = Console.ReadLine(); string D = “; if (B = “+“) D = Co

8、nvert.ToString(Convert.ToDouble(A) + Convert.ToDouble(C); if (B = “-“) D = Convert.ToString(Convert.ToDouble(A) - Convert.ToDouble(C); if (B = “*“) D = Convert.ToString(Convert.ToDouble(A) * Convert.ToDouble(C); if (O = “/“) D = Convert.ToString(Convert.ToDouble(A) / Convert.ToDouble(C); Console.Wri

9、teLine(“结果是:“ + D); 小菜的代码有什么问题呢?4第二章 代码规范、重构 大鸟说: “且先不说出题人的意思,单就你现在的代码,就有很多不足的地方需要改进。比如变量命名,你的命名就是ABCD ,变量不带有任何具体含义,这是非常不规范的;判断分支,你这样的写法,意味着每个条件都要做判断,等于计算机做了三次无用功;数据输入有效性判断等,如果用户输入的是字符符号而不是数字怎么办?如果除数时,客户输入了0 怎么办?这些都是可以改进的地方。” “哦,说得没错,这个我以前听老师说过,可是从来没有在意过,我马上改,改完再给你看看。” class Program static void Main

10、(string args) try Console.Write(“请输入数字A:“); string strNumberA = Console.ReadLine(); Console.Write(“请选择运算符号(+、-、*、/):“); string strOperate = Console.ReadLine(); Console.Write(“请输入数字B:“); string strNumberB = Console.ReadLine(); string strResult = “; switch (strOperate) case “+“: strResult = Convert.To

11、String (Convert.ToDouble(strNumberA) + Convert.ToDouble(strNumberB); break; case “-“: strResult = Convert.ToString (Convert.ToDouble(strNumberA) - Convert.ToDouble(strNumberB); break; case “*“: strResult = Convert.ToString (Convert.ToDouble(strNumberA) * Convert.ToDouble(strNumberB); break; case “/“

12、: if (strNumberB != “0“) strResult = Convert.ToString (Convert.ToDouble(strNumberA) / Convert.ToDouble(strNumberB); else strResult = “除数不能为0“; break; 5Console.WriteLine(“结果是:“ + strResult); Console.ReadLine(); catch (Exception ex) Console.WriteLine(“您的输入有错:“ + ex.Message); 大鸟:“ 吼吼,不错,不错,改得很快吗?至在目前代码

13、来说,实现计算器是没有问题了,但这样写出的代码是否合出题人的意思呢?” 小菜:“ 你的意思是面向对象?” 大鸟:“ 哈,小菜非小菜也!”6第三章 复制VS 复用 小菜:“ 我明白了,他说用任意一种面向对象语言实现,那意思就是要用面向对象的编程方法去实现,对吗?OK ,这个我学过,只不过当时我没想到而已。” 大鸟:“ 所有编程初学者都会有这样的问题,就是碰到问题就直觉的用计算机能够理解的逻辑来描述和表达待解决的问题及具体的求解过程。这其实是用计算机的方式去思考,比如计算器这个程序,先要求输入两个数和运算符号,然后根据运算符号判断选择如何运算,得到结果,这本身没有错,但这样的思维却使得我们的程序只

14、为满足实现当前的需求,程序不容易维护,不容易扩展,更不容易复用。从而达不到高质量代码的要求。” 小菜:“ 鸟哥呀,我有点糊涂了,如何才能容易维护,容易扩展,又容易复用呢,能不能具体点?” 大鸟:“ 比如说,我现在要求你再写一个 windows 的计算器,你现在的代码能不能复用呢?” 小菜:“ 那还不简单,把代码复制过去不就行了吗?改动又不大,不算麻烦。” 大鸟:“ 小菜看来还是小菜呀,有人说初级程序员的工作就是 Ctrl+C 和 Ctrl+V,这其实是非常不好的编码习惯,因为当你的代码中重复的代码多到一定程度,维护的时候,可能就是一场灾难。越大的系统,这种方式带来的问题越严重,编程有一原则,就

15、是用尽可能的办法去避免重复。想想看,你写的这段代码,有哪些是和控制台无关的,而只是和计算器有关的?” 7第四章 业务的封装 小菜:“ 你的意思是分一个类出来? 哦,对的,让计算和显示分开。” 大鸟:“ 准确的说,就是让业务逻辑与界面逻辑分开,让它们之间的耦合度下降。只有分离开,才容易达到容易维护或扩展。” 小菜:“ 让我来试试看。” class Program static void Main(string args) try Console.Write(“请输入数字A:“); string strNumberA = Console.ReadLine(); Console.Write(“请选择

16、运算符号(+、-、*、/):“); string strOperate = Console.ReadLine(); Console.Write(“请输入数字B:“); string strNumberB = Console.ReadLine(); string strResult = “; strResult = Convert.ToString( Operation.GetResult(Convert.ToDouble(strNumberA), Convert.ToDouble(strNumberB), strOperate); Console.WriteLine(“结果是:“ + strR

17、esult); Console.ReadLine(); catch (Exception ex) Console.WriteLine(“您的输入有错:“ + ex.Message); public class Operation public static double GetResult(double numberA, double numberB, string operate) double result = 0d; 8switch (operate) case “+“: result = numberA + numberB; break; case “-“: result = numb

18、erA - numberB; break; case “*“: result = numberA * numberB; break; case “/“: result = numberA / numberB; break; return result; 小菜:“ 鸟哥,我写好了,你看看!” 大鸟:“ 哈,孺鸟可教也,:),写得不错,这样就完全把业务和界面分离了。” 小菜心中暗骂:“ 你才是鸟呢。” 口中说道:“ 如果你现在要我写一个Windows 应用程序的计算器,我就可以复用这个运算类( Operation)了。” 大鸟:“ 不单是Windows 程序, Web版程序需要运算可以用它, PD

19、A,手机等需要移动系统的软件需要运算也可以用它呀。” 小菜:“ 哈,面向对象不过如此。下会写类似代码不怕了。” 大鸟:“ 别急,仅此而已,实在谈不上完全面向对象,你只用了面向对象三大特性的一个,还两个没用呢?” 小菜:“ 面向对象三大特性不就是封装、继承和多态吗,这里我用到的应该是封装。这还不够吗? 我实在看不出,这么小的程序如何用到继承。至于多态,其它我一直也不太了解它到底有什么好处,如何使用它。” 大鸟:“ 慢慢来,有的东西好学了,你好好想想吧,我要去“ 魔兽” 了,改时聊。 ”9第五章 体会简单工厂模式的美妙 次日,小菜再来找大鸟,问道: “你昨天说计算器这样的小程序还可以用到面向对象三

20、大特性?继承和多态怎么可能用得上,我实在不可理解。” 大鸟:“ 小菜很有钻研精神吗?好,今天我让你功力加深一级。你先要考虑一下,你昨天写的这个代码,能否做到很灵活的可修改和扩展呢?” 小菜:“ 我已经把业务和界面分离了呀,这不是很灵活了吗?” 大鸟:“ 那我问你,现在如果我希望增加一个开根(sqrt )运算,你如何改?” 小菜:“ 那只需要改Operation 类就行了,在switch 中加一个分支就行了。” 大鸟:“ 问题是你要加一个平方根运算,却需要把加减乘除的运算都得来参与编译,如果你一不小心,把加法运算改成了减法,这不是大大的糟糕。打个比方,如果现在公司要求你为公司的薪资管理系统做维护

21、,原来只有技术人员(月薪) ,市场销售人员(底薪+ 提成),经理(年薪+ 股份)三种运算算法,现在要增加兼职工作人员的(时薪)算法,但按照你昨天的程序写法,公司就必须要把包含有的原三种算法的运算类给你,让你修改,你如果心中小算盘一打,TMD ,公司给我的工资这么低,我真是郁闷,这会有机会了 ,于是你除了增加了兼职算法以外,在技术人员(月薪)算法中写了一句 if (员工是小菜) salary = salary * 1.1; 那就意味着,你的月薪每月都会增加10% (小心被抓去坐牢),本来是让你加一个功能,却使得原有的运行良好的功能代码产生了变化,这个风险太大了。你明白了吗?” 小菜: “哦,你的

22、意思是,我应该把加减乘除等运算分离,修改其中一个不影响另外的几个,增加运算算法也不影响其它代码,是这样吗?” 大鸟:“ 自己想去吧,如何用继承和多态,你应该有感觉了。” 小菜:“OK ,我马上去写。” / / 运算类 / class Operation private double _numberA = 0; private double _numberB = 0; / / 数字A / public double NumberA get return _numberA; set _numberA = value; / 10/ 数字B / public double NumberB get re

23、turn _numberB; set _numberB = value; / / 得到运算结果 / / public virtual double GetResult() double result = 0; return result; / / 加法类 / class OperationAdd : Operation public override double GetResult() double result = 0; result = NumberA + NumberB; return result; / / 减法类 / class OperationSub : Operation p

24、ublic override double GetResult() double result = 0; result = NumberA - NumberB; return result; 11/ / 乘法类 / class OperationMul : Operation public override double GetResult() double result = 0; result = NumberA * NumberB; return result; / / 除法类 / class OperationDiv : Operation public override double

25、GetResult() double result = 0; if (NumberB = 0) throw new Exception(“除数不能为0。“); result = NumberA / NumberB; return result; 小菜:“ 大鸟哥,我按照你说的方法写出来了一部分,首先是一个运算类,它有两个Number 属性,主要用于计算器的前后数,然后有一个虚方法GetResult() ,用于得到结果,然后我把加减乘除都写成了运算类的子类,继承它后,重写了GetResult() 方法,这样如果要修改任何一个算法,都不需要提供其它算法的代码了。但问题来了,我如何让计算器知道我是希

26、望用哪一个算法呢?” 大鸟:“ 写得很不错吗,大大超出我的想象了,你现在的问题其实就是如何去实例化对象的问题,哈,今天心情不错,再教你一招 简单工厂模式 ,也就是说,到底要实例化谁,将来会不会增加实例化的对象(比如增加开根运算),这是很容易变化的地方,应该考虑用一个单独的类来做这个创造实例的过程,这就是工厂,来,我们看看这个类如何写。 ” / / 运算类工厂 / class OperationFactory public static Operation createOperate(string operate) Operation oper = null; 12switch (operate

27、) case “+“: oper = new OperationAdd(); break; case “-“: oper = new OperationSub(); break; case “*“: oper = new OperationMul(); break; case “/“: oper = new OperationDiv(); break; return oper; 大鸟: “哈,看到吧,这样子,你只需要输入运算符号,工厂就实例化出合适的对象,通过多态,返回父类的方式实现了计算器的结果。” Operation oper; oper = OperationFactory.create

28、Operate(“+“); oper.NumberA = 1; oper.NumberB = 2; double result = oper.GetResult(); 大鸟: “哈,界面的实现就是这样的代码,不管你是控制台程序, Windows程序, Web程序, PDA或手机程序,都可以用这段代码来实现计算器的功能,当有一天我们需要更改加法运算,我们只需要改哪里?” 小菜:“ 改OperationAdd 就可以了。 ” 大鸟: “ 那么我们需要增加各种复杂运算,比如平方根,立方根,自然对数,正弦余弦等,如何做?” 小菜:“ 只要增加相应的运算子类就可以了呀。” 大鸟: “ 嗯?够了吗?” 小

29、菜:“ 对了,还需要去修改运算类工厂,在switch 中增加分支。” 大鸟: “ 哈,那才对,那如果要修改界面呢?” 小菜:“ 那就去改界面呀,关运算什么事呀。” 小菜:“ 回想那天我面试题写的代码,我终于明白我为什么写得不成功了,原来一个小小的计算器也可以写出这么13精彩的代码,谢谢大鸟。” (下为当时面试题时小菜所写代码,见小菜编程成长记(一)) Program static void Main(string args) Console.Write(“请输入数字A:“); string A = Console.ReadLine(); Console.Write(“请选择运算符号(+、-、*

30、、/):“); string B = Console.ReadLine(); Console.Write(“请输入数字B:“); string C = Console.ReadLine(); string D = “; if (B = “+“) D = Convert.ToString(Convert.ToDouble(A) + Convert.ToDouble(C); if (B = “-“) D = Convert.ToString(Convert.ToDouble(A) - Convert.ToDouble(C); if (B = “*“) D = Convert.ToString(Co

31、nvert.ToDouble(A) * Convert.ToDouble(C); if (O = “/“) D = Convert.ToString(Convert.ToDouble(A) / Convert.ToDouble(C); Console.WriteLine(“结果是:“ + D); 大鸟: “ 吼吼,记住哦, 编程是一门技术,更加是一门艺术 ,不能只满足于写完代码运行结果正确就完事,时常考虑如何让代码更加简炼,更加容易维护,容易扩展和复用,只有这样才可以是真的提高。写出优雅的代码真的是一种很爽的事情。不过学无止境,其实这才是理解面向对象的开始呢。给你出个作业,做一个商场收银软件,

32、营业员根据客户购买商品单价和数量,向客户收费。” 小菜:“ 就这个?没问题呀。”14第六章 关于Flex的争论? 声明:本文略有广告之嫌,不过写此文的初衷却是因为对上篇博客引发争议的感想,所以看此文前不妨先看看上文的评论,感谢您的阅读,欢迎拍砖。 几天后,小菜跑到大鸟处,说道:“ 大鸟哥,今天看到一个网站,叫 妙句网 ,是用来收藏好句子用的,网站本身没什么太多希奇,但它用的技术却是最近非常火的Flex 技术,作者说他也就学了不到两个月就做出了这个网站,你说会不会是真的?如果真的是这样,我也想学学,毕竟做出来的效果比一般的网站真的要酷很多哦。” 大鸟:“ 哦?让我来看看。” 大鸟打开了浏览器,键

33、入了小菜说的网站。 “嗯?怎么是 flash 的?” 大鸟说。 小菜点头道: “Flex 其实就是开发出可以在 Flash Player 插件上运行的编程工具!你看,它整个网站就是一个 Flash,开始下载是慢了点,但下载好了,大部分操作都不用再访问网络了,局部的更新数据,也只是局部刷新而已。你点这个登录,哈,登录就从上框跳出来,还会抖动两下,再看,点这个Show 出来框后,点 播放 ,那个句子翻页的 3D 效果是不是很酷?还有 ” “Stop! 停! ”大鸟突然说道, “你是来给我做广告来了?这种纯粹为炫点效果而做的网站我见得多了,有什么希奇的。我虽然没做过 Flash,但开发这些年,我还不

34、知道?就象我没得过禽流感,但感冒啥滋味,我不会比鸡知道的少了。” “可是听说这技术很容易学,用不了多久就可以上手,做出漂亮的东西。你之前不是还整天跟我说 AJAX 太他妈麻烦,JavaScript 调试极度困难,还要考虑跨浏览器等诸多问题,写 Ajax 网站吃力不讨好吗?” “哈哈,小菜呀小菜,外行了吧。写这网站的人说是只学了 Flex 一个多月做出这东西,我也相信他说的是真的,但这里面有多少细节技术是你看不到的?我说几个细节给你听听,比如注册,Email 如何验证?这用正则表达式判断最好,你得懂才行,哪怕上网查,至少你要知道如何用吧。再比如这网站上的分页,每页显示 10 条信息,如果把一千多

35、条句子全下载不就傻了吗?可若每次换页只下载 10 条,这就得懂得如何写这样的 Sql 语句,当然最好是存储过程。至于整个网站包括了从注册、登录、增删改句子到句子列表,正文显示,搜索查询,这就是一整套的网站基本架构,这些都是要技术积累的。” “啊,这倒是真的,正则表达式学过,但还是不会用,分页存储过程干脆就写不来,要独立写个网站,看来也的确是有难度的。” 15“不过,这网站其实做了也没太大的用处。” 大鸟说道,“ 第一,Flash 占的系统资源太大,你看,我才点击 tag 查询,我的 CPU 就 100%,我在放的 MP3,声音都开始打抖了,这真的很不爽。第二, Flash 是封装成 swf 文

36、件下载的,也就是说搜索引擎是根本找不到里面的数据,里面的句子也就谈不上被搜索到。这样这些数据又如何能被大众用户查看到?” “咦,我在家里好像感觉不到速度问题吗?哦,我明白了,因为我的笔记本是双核的,最多也就占用 50%,看来硬件的提升也是促进软件的发展呀。不过搜索引擎好像是很难办,有没有什么解决方案?” 大鸟说:“ 搜索引擎对整站 SWF 的索引的问题,目前没有什么完美的解决方法,或许,我们可以生成一个 sitemap,让搜索引擎的爬虫自己爬上来。” 大鸟继续说道:“ 所以我说这种网站,没什么太大用处, Flex 这种富客户端技术,不过是个噱头罢了。” “唉,大鸟,我就不同意的你看法。 ”小菜

37、有点激动, “现在有了 DVD,你还会去小摊买 SVCD 看吗?现在有了 Windows,你还会去整天对着黑屏用 Dos 敲打命令行吗?富客户端可以做到更加好的客户感受度,又不用安装和升级,这结合 C/S和 B/S 的优点于一身的好技术。” “小菜,html 是 Internet 的主流,要客户感受度,还是好好研究 JavaScript 的 AJAX 技术吧。” 大鸟语重声长的说。 “降龙十八掌固然强悍勇猛,那是因为没有发明手枪;赤兔固然是良驹,那是因为关老儿没有宝马大奔。谁说 html 今天是主流,就意味着未来是主流?我觉得 AJAX 有很大的局限性,是一种过渡技术。未来一定是富客户端的天下

38、。” “小菜别激动,你说得也有道理。我举个例子你就会明白,Flex 或 Flash 以前是 Macromedia 现在上 Adobe 的主推的产品吧,那我问你,他们的官方网站是什么写的?” 大鸟慢条斯理道。 “这个 好像还是 html”。小菜犹豫后答道。 “你有想过为什么?还有那些 Flex 的技术网站,比如博客呀论坛呀什么的,我敢肯定的说,一定不是用富客户端技术做的。” “是不是因为不好搜索?” 小菜疑问中。 “这是一方面吧,其实文字信息很大的网站,都不太适合这种技术的,因为它要的不是过渡效果,而是内容本身。如果内容不够好,网站再漂亮也是没有用的,而内容够好,却没有人能找得到这些内容,这内容

39、也是价值不大的,这也正是为什么连 Adobe 公司自己在发布网站时也用的是传统的 html 模式。” “是,我理解你的意思,就是说这种文字信息网站不适合,但有些网站,比如公司产品展示,动漫游戏等才更适合是吗? ” 16大鸟说:“ 当然,还不只是这些,Google 推出一种理念,就是要弱化客户端,强化网络,也就是说,过去我们上网的习惯是下载,把好的东西都下载到本地来,现在要反过来。比如以前我们都是把 Email 收到本地,不然网络信箱就会满而收不了信,但这就带来了一个坏处,你要是没有在这台机器旁,你想看你以前的信就不可能了,甚至操作系统崩溃后可能这些信就没了,当然照片,文档也是如此。现在呢,最好

40、的办法是把所有的信息,都放在网络上,比如 Gmail 里,比如 163 里,或者什么网站硬盘里(最好是大公司)。只要有网络你想在什么地方用它都行。” “明白,同样道理,我现在看到的 在线 Office、 在线 Web OS、 在线图片处理 等应用,都是Flex 的应用,也就是说以后这些都不需要操作系统里安装什么软件了。” “哈,小菜开窍了,这样操作系统的功能就下降了,以前要听音乐看电影都需下载,现在都是在线听,以前游戏都是在家独自玩,现在都网游,现在聊天都 QQ, MSN,将来都 WebIM,总有一天,客户端会只是一个类似浏览器的东东就行的,不只是电脑,手机,家电都能上 Internet,那才

41、是未来发展的方向。不过,你知道吗?真这样的话,谁最不开心?” “嗯?谁会不开心?这不是大家都好吗?” “哈,当然是微软最不开心,因为他们是卖操作系统的呀,操作系统功能越来越弱化了,他们的市场不就小了吗?所以同样是推出富客户端应用( WPF 和 Flex), 微软和 Adobe 的想法是不一样的,微软是希望和操作系统连接更紧密,而 Adobe或 Google 却是希望客户端越简单越好。” “大鸟呀,你说话前后矛盾的,刚才还在和我说Flex 这种富客户端技术,不过是个噱头罢了 ,现在又在大谈富客户端的好,你到底是什么意思?” “咱们领袖毛老人家说过,看问题要用辩证法,事物都有两面性。富客户端有好的

42、方面,当然也存在着不足,现在这技术还不够成熟,至少在以文字内容为主的网站,这种技术还是没太大的用处,所以妙句网只是一个噱头,不能成大气候。 ” “我却觉得,新事物总会有人说不好的,妙句这个创意本身很好,用这个技术也感觉和一般网站不一样,只不过现在刚开始,还没有发挥 Flex 的特性吧,听说 AJAX 和 Flex 可以直接通讯的,或许和 html 结合一下,句子能被搜索引擎找到,加上性能优化后让客户端 CPU 压力不太大,我相信它会越来越好起来。我决定了,我也要学 Flex,做一个贼酷的富客户端网站。” “得了吧你,” 大鸟说道,“ 你还是好好打好基础,上会你写完计算器的程序,后面我留的作业你

43、做了没有,就是做一个商场收银软件,营业员根据客户购买商品单价和数量,向客户收费。” “啊,我忘记了,那个没什么大问题,我尽快去写。” 17第七章 工厂不好用了 ? 小菜心里想:“ 大鸟要我做的是一个商场收银软件,营业员根据客户购买商品单价和数量,向客户收费。这个很简单,两个文本框,输入单价和数量,再用个列表框来记录商品的合计,最终用一个按钮来算出总额就可,对,还需要一个重置按钮来重新开始,不就行了?!” 代码样例(可使用): 商场收银系统 v1.0关键代码如下: /声明一个double变量total来计算总计 double total = 0.0d; private void btnOk_Cl

44、ick(object sender, EventArgs e) /声明一个double变量totalPrices来计算每个商品的单价(txtPrice)*数量(txtNum)后的合计 double totalPrices = Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text); /将每个商品合计计入总计 total = total + totalPrices; /在列表框中显示信息 lbxList.Items.Add( “单价:“ + txtPrice.Text + “ 数量:“ + txtNum.Text + “ 合

45、计:“ + totalPrices.ToString(); /在lblResult标签上显示总计数 lblResult.Text = total.ToString(); 18“大鸟,” 小菜叫道,“ 来看看,这不就是你要的收银软件吗?我不到半小时就搞定了。” “哈哈,很快吗,” 大鸟说着,看了看小菜的代码。接着说:“ 现在我要求商场对商品搞活动,所有的商品打 8 折。” “那不就是在 totalPrices 后面乘以一个 0.8 吗?” “小子,难道商场活动结束,不打折了,你还要再把程序改写代码再去把所有机器全部安装一次吗?再说,我现在还有可能因为周年庆,打五折的情况,你怎么办?” 小菜不好意

46、思道:“ 啊,我想得是简单了点。其实只要加一个下拉选择框就可以解决你说的问题。” 大鸟微笑不语。 商场收银系统 v1.1 关键代码如下: double total = 0.0d; private void btnOk_Click(object sender, EventArgs e) double totalPrices = 0d; /cbxType是一个下拉选择框,分别有“正常收费”、“打8折”、“打7折”和“打5折” switch (cbxType.SelectedIndex) case 0: totalPrices = Convert.ToDouble(txtPrice.Text) *

47、Convert.ToDouble(txtNum.Text); break; case 1: totalPrices = Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text) * 0.8; break; case 2: totalPrices = Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text) * 0.7; break; case 3: totalPrices = Convert.ToDouble(txtPrice.Text) * Conver

48、t.ToDouble(txtNum.Text) * 0.5; break; total = total + totalPrices; lbxList.Items.Add( “单价:“ + txtPrice.Text + “ 数量:“ + txtNum.Text + “ “ + cbxType.SelectedItem + “ 合计:“ + totalPrices.ToString(); lblResult.Text = total.ToString(); 19 “这下可以了吧,只要我事先把商场可能的打折都做成下拉选择框的项,要变化的可能性就小多了。” 小菜说道。 “这比刚才灵活性上是好多了,不过重复代码很多,像Convert.ToDouble (),你这里就写

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报