第二讲 策略模式.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《第二讲 策略模式.ppt》由会员分享,可在线阅读,更多相关《第二讲 策略模式.ppt(35页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第二讲策略模式商场促销v大鸟:“吼吼,记住了,编程是一门技术,更是一门艺术编程是一门技术,更是一门艺术,不能只满足于写完代码运行结果正确就完事,时常考虑如何让代码更加简炼,更加容易维护,容易扩展和复用,只有这样才可以是真的提高。写出优雅的代码真的是一种很爽的事情。不过学无止境,其实这才是理解面向对象的开始呢。给你出个作业:做一个商场收银软件,营业员根据客户购买商品单价和数量,向客户收费。”v小菜:“就这个?没问题呀。”v小菜心里想:“大鸟要我做的是一个商场收银软件,营业员根据客户购买商品单价和数量,向客户收费。这个很简单,两个文本框,输入单价和数量,再用个列表框来记录商品的合计,最终用一个按钮
2、来算出总额就可,对,还需要一个重置按钮来重新开始,不就行了?!”地点:大鸟房间地点:大鸟房间人物:小菜、大鸟人物:小菜、大鸟时间:某晚时间:某晚10点点小菜的初版关键代码v商场收银系统v1.0关键代码如下:v/声明一个double变量total来计算总计vdoubletotal=0.0d;vprivatevoidbtnOk_Click(objectsender,vEventArgse)vdoubletotalPrices=Convert.ToDouble(txtPrice.Text)*vConvert.ToDouble(txtNum.Text);vtotal=total+totalPrices
3、;vlbxList.Items.Add(“单价:”+txtPrice.Text+“数量:v+txtNum.Text+合计:+totalPrices.ToString();vlblResult.Text=total.ToString();v点击确定按钮执行的业务逻辑需求稍变如何?v“大鸟,”小菜叫道,“来看看,这不就是你要的收银软件吗?我不到半小时就搞定了。”v“哈哈,很快嘛,”大鸟说着,看了看小菜的代码。接着说:“现在我要求商场对商品搞活动,所有的商品打8折。”v“那不就是在totalPrices后面乘以一个0.8吗?”v“小子,难道商场活动结束,不打折了,你还要再改写一遍程序代码,再去把所有
4、机器全部安装一次吗?再说,我现在还有可能因为周年庆,打五折的情况,你怎么办?”v小菜不好意思道:“啊,我想得是简单了点。其实只要加一个下拉选择框就可以解决你说的问题。”v大鸟微笑不语。商场收银系统v1.1关键代码vdoubletotal=0.0d;/总计总计vprivatevoidform1_Load(objectsender,EventArgse)vcbxType.Items.Addrange(newobject“正常收费正常收费”,“8折折”,“7折折”);vcbxType.SelectedIndex=0;/初始化折扣下拉框初始化折扣下拉框vvprivatevoidbtnOk_Click(
5、objectsender,EventArgse)vdoubletotalPrices=0d;vswitch(cbxType.SelectedIndex)/根据选项决定打折额度根据选项决定打折额度vcase0:totalPrices=Convert.ToDouble(txtPrice.Text)*vConvert.ToDouble(txtNum.Text);break;vcase1:totalPrices=Convert.ToDouble(txtPrice.Text)*vConvert.ToDouble(txtNum.Text)*0.8;break;vcase2:totalPrices=Conv
6、ert.ToDouble(txtPrice.Text)*vConvert.ToDouble(txtNum.Text)*0.7;break;vvtotal=total+totalPrices;vlbxList.Items.Add(“单价:单价:”+txtPrice.Text+“数量:数量:v+txtNum.Text+合计:合计:+totalPrices.ToString();vlblResult.Text=total.ToString();v再添点需求如何?v“这下可以了吧,只要我事先把商场可能的打折都做成下拉选择框的项,要变化的可能性就小多了。”小菜说道。v“这比刚才灵活性上是好多了,不过重复
7、代码很多,像Convert.ToDouble(),你这里就写了6遍,而且3个分支要执行的语句除了打折多少以外几乎没什么不同,应该考虑重构一下。不过还不是最主要的,现在我的需求又来了,商场的活动加大,需要有满300返100的促销算法,你说怎么办?”v“满300返100,那要是700就要返200了?这个必须要写函数了吧?”v“小菜呀,看来之前教你的白教了,这里面看不出什么名堂吗?”简单工厂模式能解决一切?v“哦!我想起来了,你的意思是简单工厂模式是吧,对的对的,我可以先写一个父类,再继承它实现多个打折和返利的子类,利用多态,完成这个代码。”v“你打算写几个子类?”v“根据需求呀,比如8折、7折、5
8、折、满300送100、满200送50要几个写几个。”v“小菜又不动脑子了,有必要这样吗?如果我现在要3折,我要满300送80,你难道再去加子类?你不想想看,这当中哪些是相同的,哪些是不同的?”v“对的,这里打折基本都是一样的,只要有个初始化参数就可以了。满几送几的,需要两个参数才行,明白,现在看来不麻烦了。”学会抽象!v“面向对象的编程,并不是类越多越好,类的划分是为了封面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象装,但分类的基础是抽象,具有相同属性和功能的对象的抽具有相同属性和功能的对象的抽象集合才是类象集合才是类。打一折和打九折只是形式的不同,抽象分析出来,所有
9、的打折算法都是一样的,所以打折算法应该是一个类。好了,空话已说了太多,写出来才是真的懂。”v大约1个小时后,小菜交出了第三份的作业代码结构图cashFactory+createCashAccept():CashSuper?各类的具体实现v现金收费抽象类(CashSuper)vabstractclassCashSupervpublicabstractdoubleacceptCash(doublemoney);vv正常收费子类(CashNormal)vclassCashNormal:CashSupervpublicoverridedoubleacceptCash(doublemoney)vretu
10、rnmoney;vv正常收费,原价返回抽象方法,收取现金,参数是原价,返回为当前价打折收费子类vclassCashRebate:CashSupervprivatedoublemoneyRebate=1d;vpublicCashRebate(StringmoneyRebate)vthis.moneyRebate=double.parse(moneyRebate);vvpublicoverridedoubleacceptCash(doublemoney)vreturnmoney*moneyRebate;vv打折收费,必须输入初始折扣率返利收费子类vclassCashReturn:CashSuper
11、vprivatedoublemoneyCondition=0.0d;vprivatedoublemoneyReturn=0.0d;vpublicCashReturn(StringmoneyCondition,StringmoneyReturn)vthis.moneyCondition=double.parse(moneyCondition);vthis.moneyReturn=double.parse(moneyReturn);vvpublicoverridedoubleacceptCash(doublemoney)vdoubleresult=money;vif(money=moneyCond
12、ition)vresult=money-Math.Floor(money/moneyCondition)*moneyReturn;vreturnresult;vv返利收费,必须输入两个初始参数:返利条件和返利值,如满300送100若大于返利条件,则需减去返利值现金收费工厂类vclassCashFactoryvpublicstaticCashSupercreateCashAccept(Stringtype)vCashSupercs=null;vswitch(type)vcase“正常收费”:vcs=newCashNormal();break;vcase“满300送100”:vcs=newCash
13、Return();break;vcase“8折”:vcs=newCashRebate();break;vvreturncs;vv现金收费工厂根据条件返回相应收费对象客户端程序主要部分vdoubletotal=0.0d;/声明一个double变量total来计算总计vprivatevoidbtnOk_Click(objectsender,EventArgse)vCashSupercs;vcs=CashFactory.createCashAccept(cbxType.SelectedItem.toString();vdoubletotalPrices=cs.acceptCash(vConvert.
14、ToDouble(txtPrice.Text)*Convert.ToDouble(txtNum.Text);vtotal=total+totalPrices;vlbxList.Items.Add(“单价:”+txtPrice.Text+“数量:”+txtNum.Text+“”v+cbxType.SelectedItem+合计:+totalPrices.ToString();vlblResult.Text=total.ToString();v你能让客户不提要求吗?v“大鸟,搞定,这次无论你要怎么改,我都可以简单处理就行了。”小菜自信满满的说。v“是吗,要是需要打5折和满500送200的促销活动,
15、如何办?”v“只要在收费对象生成工厂当中加两个条件,在界面的下拉选项框里加两项,就OK了。”v“说得不错,如果我现在需要增加一种商场促销手段,满100积分10点,以后积分到一定时候可以领取奖品如何做?”v“有了工厂,何难?加一个积分算法类,构造方法有两个参数:条件和返点,让它继承CashSuper,再到收费对象生成工厂里加满100积分10点的分支条件,再到界面稍加改动,就行了。”你能让客户不提要求吗?v“嗯,不错,那我问你,如果商场现在需要拆迁,没办法,只能跳楼价销售,商场的所有商品都需要打8折,打折后的价钱再每种商品满300送50,最后计总价的时候,商场还满1000送200,你说如何办?”v
16、“搞没搞错哦,这商场不如白送得了,哪有这样促销的?老板跳楼时估计都得赤条条的了。”v“商场大促销你还不高兴呀!当然,你是软件开发者,客户老是变动需求的确不爽,但你不能不让客户提需求呀,我不是说过吗,需求的变更是必然需求的变更是必然!所以开发者应该做的是考虑开发者应该做的是考虑如何让自己的程序更能适应变化,而不是抱怨客户的无理,如何让自己的程序更能适应变化,而不是抱怨客户的无理,客户不会管程序员加班时的汗水,也不相信程序员失业时的客户不会管程序员加班时的汗水,也不相信程序员失业时的眼泪眼泪,因为客户自己正在为自己的放血甩卖而流泪呀。”老革命遇到了新问题v“你对简单工厂用得很熟练了嘛。”大鸟接着说
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第二讲 策略模式 第二 策略 模式
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内