日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

大话设计模式(七 工厂不好用了?)

發(fā)布時間:2025/3/21 asp.net 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大话设计模式(七 工厂不好用了?) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

(續(xù)上篇)

???????? 小菜心里想:“大鳥要我做的是一個商場收銀軟件,營業(yè)員根據(jù)客戶購買商品單價和數(shù)量,向客戶收費。這個很簡單,兩個文本框,輸入單價和數(shù)量,再用個列表框來記錄商品的合計,最終用一個按鈕來算出總額就可,對,還需要一個重置按鈕來重新開始,不就行了?!”

代碼樣例(可使用):


商場收銀系統(tǒng)v1.0關鍵代碼如下:

//聲明一個double變量total來計算總計double total = 0.0d;private void btnOk_Click(object sender, EventArgs e){//聲明一個double變量totalPrices來計算每個商品的單價(txtPrice)*數(shù)量(txtNum)后的合計double totalPrices=Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text);//將每個商品合計計入總計total = total + totalPrices;//在列表框中顯示信息lbxList.Items.Add("單價:"+txtPrice.Text+" 數(shù)量:"+txtNum.Text+" 合計:"+totalPrices.ToString());//在lblResult標簽上顯示總計數(shù)lblResult.Text = total.ToString();}

?“大鳥,”小菜叫道,“來看看,這不就是你要的收銀軟件嗎?我不到半小時就搞定了。”

???????“哈哈,很快嗎,”大鳥說著,看了看小菜的代碼。接著說:“現(xiàn)在我要求商場對商品搞活動,所有的商品打8折。”
???????“那不就是在totalPrices后面乘以一個0.8嗎?”
???????“小子,難道商場活動結束,不打折了,你還要再把程序改寫代碼再去把所有機器全部安裝一次嗎?再說,我現(xiàn)在還有可能因為周年慶,打五折的情況,你怎么辦?”
??????? 小菜不好意思道:“啊,我想得是簡單了點。其實只要加一個下拉選擇框就可以解決你說的問題。”
??????? 大鳥微笑不語。

商場收銀系統(tǒng)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) * 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) * Convert.ToDouble(txtNum.Text) * 0.5;break;}total = total + totalPrices;lbxList.Items.Add("單價:" + txtPrice.Text + " 數(shù)量:" + txtNum.Text + " "+cbxType.SelectedItem+ " 合計:" + totalPrices.ToString());lblResult.Text = total.ToString();}

?“這下可以了吧,只要我事先把商場可能的打折都做成下拉選擇框的項,要變化的可能性就小多了。”小菜說道。

?????? “這比剛才靈活性上是好多了,不過重復代碼很多,像Convert.ToDouble(),你這里就寫了8遍,而且4個分支要執(zhí)行的語句除了打折多少以外幾乎沒什么不同,應該考慮重構一下。不過還不是最主要的,現(xiàn)在我的需求又來了,商場的活動加大,需要有滿300返100的促銷算法,你說怎么辦?”
??????? “滿300返100,那要是700就要返200了?這個必須要寫函數(shù)了吧?”
???????? “小菜呀,看來之前教你的白教了,這里面看不出什么名堂嗎?”???
?????????“哦!我想起來了,你的意思是簡單工廠模式是吧,對的對的,我可以先寫一個父類,再繼承它實現(xiàn)多個打折和返利的子類,利用多態(tài),完成這個代碼。”
?????????“你打算寫幾個子類?”
???????? “根據(jù)需求呀,比如8折、7折、5折、滿300送100、滿200送50……要幾個寫幾個。”
??????? “小菜又不動腦子了,有必要這樣嗎?如果我現(xiàn)在要3折,我要滿300送80,你難道再去加子類?你不想想看,這當中哪些是相同的,哪些是不同的?”
???????? “對的,這里打折基本都是一樣的,只要有個初始化參數(shù)就可以了。滿幾送幾的,需要兩個參數(shù)才行,明白,現(xiàn)在看來不麻煩了。”
??????? “面向對象的編程,并不是類越多越好,類的劃分是為了封裝,但分類的基礎是抽象,具有相同屬性和功能的對象的抽象集合才是類 。打一折和打九折只是形式的不同,抽象分析出來,所有的打折算法都是一樣的,所以打折算法應該是一個類。好了,空話已說了太多,寫出來再是真的懂。”

???????? 大約1個小時后,小菜交出了第三份的作業(yè)


商場收銀系統(tǒng)v1.3關鍵代碼如下

?

//現(xiàn)金收取父類abstract class CashSuper{//抽象方法:收取現(xiàn)金,參數(shù)為原價,返回為當前價public abstract double acceptCash(double money);}//正常收費,繼承CashSuperclass CashNormal : CashSuper{public override double acceptCash(double money){return money;}}//打折收費,繼承CashSuperclass CashRebate : CashSuper{private double moneyRebate = 1d;//初始化時,必需要輸入折扣率,如八折,就是0.8public CashRebate(string moneyRebate){this.moneyRebate = double.Parse(moneyRebate);}public override double acceptCash(double money){return money * moneyRebate;}}//返利收費,繼承CashSuperclass CashReturn : CashSuper{private double moneyCondition = 0.0d;private double moneyReturn = 0.0d;//初始化時必須要輸入返利條件和返利值,比如滿300返100,則moneyCondition為300,moneyReturn為100public CashReturn(string moneyCondition, string moneyReturn){this.moneyCondition = double.Parse(moneyCondition);this.moneyReturn = double.Parse(moneyReturn);}public override double acceptCash(double money){double result = money;//若大于返利條件,則需要減去返利值if (money >= moneyCondition)result = money - Math.Floor(money / moneyCondition) * moneyReturn;return result;}}//現(xiàn)金收取工廠class CashFactory{//根據(jù)條件返回相應的對象public static CashSuper createCashAccept(string type){CashSuper cs = null;switch (type){case "正常收費":cs = new CashNormal();break;case "滿300返100":CashReturn cr1 = new CashReturn("300", "100");cs = cr1;break;case "打8折":CashRebate cr2 = new CashRebate("0.8");cs = cr2;break;}return cs;}}//客戶端窗體程序(主要部分)CashSuper csuper;//聲明一個父類對象double total = 0.0d;private void btnOk_Click(object sender, EventArgs e){//利用簡單工廠模式根據(jù)下拉選擇框,生成相應的對象csuper = CashFactory.createCashAccept(cbxType.SelectedItem.ToString());double totalPrices=0d;//通過多態(tài),可以得到收取費用的結果totalPrices = csuper.acceptCash(Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text));total = total + totalPrices;lbxList.Items.Add("單價:" + txtPrice.Text + " 數(shù)量:" + txtNum.Text + " "+cbxType.SelectedItem+ " 合計:" + totalPrices.ToString());lblResult.Text = total.ToString();}

代碼樣例(可使用)


??????“大鳥,搞定,這次無論你要怎么改,我都可以簡單處理就行了。”小菜自信滿滿的說。
??????“是嗎,我要是需要打5折和滿500送200的促銷活動,如何辦?”
??????“只要在現(xiàn)金工廠當中加兩個條件,在界面的下拉選項框里加兩項,就OK了。”
??????“現(xiàn)金工廠?!你當是生產鈔票呀。是收費對象生成工廠才準確。說得不錯,如果我現(xiàn)在需要增加一種商場促銷手段,滿100積分10點,以后積分到一定時候可以領取獎品如何做?”
??????“有了工廠,何難?加一個積分算法,構造方法有兩個參數(shù):條件和返點,讓它繼承CashSuper,再到現(xiàn)金工廠,哦,不對,,是收—費—對—象—生—成—工—廠里加滿100積分10點的分支條件,再到界面稍加改動,就行了。”
??????“嗯,不錯,那我問你,如果商場現(xiàn)在需要拆遷,沒辦法,只能跳樓價銷售,商場的所有商品都需要打8折,打折后的價錢再每種商品滿300送50,最后計總價的時候,商場還滿1000送200,你說如何辦?”
??????“搞沒搞錯哦,這商場不如白送得了,哪有這樣促銷的?老板跳樓時估計都得赤條條的了。”
?????? “商場大促銷你還不高興呀!當然,你是軟件開發(fā)者,客戶老是變動需求的確不爽,但你不能不讓客戶提需求呀,我不是說過嗎,需求的變更是必然!所以開發(fā)者應該的是考慮如何讓自己的程序更能適應變化,而不是抱怨客戶的無理,客戶不會管程序員加班時的汗水,也不相信程序員失業(yè)時的眼淚,因為客戶自己正在為自己的放血甩賣而流淚呀。”
??????? 大鳥接著說:“簡單工廠模式雖然也能解決這個問題,但的確不是最好的辦法,另外由于商場是可能經常性的更改打折額度和返利額度,每次更改都需要改寫代碼重新編譯部署真的是很糟糕的處理方式,面對算法的時常變動,應該有更好的辦法。好好去研究一下設計模式吧,推薦你看一本書,《深入淺出設計模式》,或許你看完第一章,就會有解決辦法了。”
??????? 小菜進入了沉思中……
?

(待續(xù))

本例C#源代碼
另:建議大家去閱讀《深入淺出設計模式》,第一章下載,本人非常喜歡這本書的風格,這是真正的做到了深入淺出呀。我也希望自己可以用類似的方式講述問題。
本文還有一個用意是對一些初學者,可以考慮一下大鳥提出的問題,在我的下一篇《小菜編程成長記 八》出來之前,改寫我的源代碼,實現(xiàn)更靈活更方便的商場收銀程序共享給大家討論,或許您寫的東東比我寫的還要好,那樣就大家都有提高了。程序不是看出來的,是寫出來的。好好加油!

出處:http://www.cnblogs.com/cj723/archive/2007/03/20/680091.html

總結

以上是生活随笔為你收集整理的大话设计模式(七 工厂不好用了?)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 影音先锋亚洲一区 | 亚洲综合五月 | 丰满少妇被猛烈进入高清播放 | a天堂视频 | 泰国午夜理伦三级 | 欧美一区二区激情 | 少妇真实被内射视频三四区 | ass极品水嫩小美女ass | 99视频一区二区 | 色视频免费看 | 性色av蜜臀av浪潮av老女人 | 无码人妻久久一区二区三区不卡 | 欧美一级淫片免费视频黄 | 亚洲精品aaaaa | 麻豆成人免费 | 天海翼av在线播放 | 国产视频黄色 | 中文字幕成人在线观看 | 动漫美女被吸乳奶动漫视频 | 亚洲最新偷拍 | 国产精品丝袜黑色高跟鞋 | 欧美用舌头去添高潮 | 海角官网| 欧美jjzz| 欧美一级黄色片子 | 日本公妇乱淫免费视频一区三区 | 啪啪免费网| 久久嫩草精品久久久久 | 激情欧美在线 | caoporn免费在线视频 | 日韩一级片网址 | 农村黄色片 | 国产美女在线观看 | 中文字幕一区二区三区四区 | www.黄色一片| 神马影院午夜伦理 | 黄黄视频在线观看 | 我的丝袜美腿尤物麻麻 | 中国av片 | 尤物影院在线观看 | 小辣椒福利视频导航 | 经典av在线 | 久久精品美女视频 | 男人午夜免费视频 | 日韩精品高清在线 | xxxx日韩| 播金莲一级淫片aaaaaaa | 三级视频在线看 | 国语对白真实视频播放 | 美女xx00| 美味的客房沙龙服务 | 成人污视频 | 国产乱码精品1区2区3区 | 久久久久亚洲av成人毛片韩 | 国产免费片| 精品国产伦一区二区三区 | 成人在线观看免费 | 91视频 - 88av| 99极品视频 | 午夜视频黄| 精品人妻一区二区三区换脸明星 | 亚洲精品在线播放视频 | 开心激情五月网 | 黄a大片| 久久人人妻人人人人妻性色av | 欧美狠狠操| 91精品国产色综合久久不卡电影 | aaa国产| 激情插插 | 国产拍拍拍 | 精品一区精品二区 | 久久精品国产亚洲AV黑人 | 三级av在线播放 | 瑟瑟综合网 | 中文字幕人妻精品一区 | 青青操影院 | 中文字幕33页 | 波多野结衣成人在线 | 久久在线播放 | 日韩精品无码一区二区三区 | 亚洲在线免费观看视频 | 黄色免费视频网站 | xxx综合网| 日本精品一区二区 | 华人色 | 春色导航| 国产又黄又粗的视频 | 亚洲欧美另类在线 | 就爱啪啪网 | 欧美丝袜一区二区 | 国产精品99久久久久久久久 | 最新地址在线观看 | √天堂中文官网8在线 | 欧美视频一区二区 | 九一精品视频 | 国模无码一区二区三区 | 性感美女视频一二三 | 97夜夜操| 国产一级大片在线观看 |