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

歡迎訪問 生活随笔!

生活随笔

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

asp.net

大话设计模式(五 体会简单工厂模式的美妙)

發布時間:2025/3/21 asp.net 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大话设计模式(五 体会简单工厂模式的美妙) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(續上篇)?

???????次日,小菜再來找大鳥,問道:“你昨天說計算器這樣的小程序還可以用到面向對象三大特性?繼承和多態怎么可能用得上,我實在不可理解。”
??????? 大鳥:“小菜很有鉆研精神嗎?好,今天我讓你功力加深一級。你先要考慮一下,你昨天寫的這個代碼,能否做到很靈活的可修改和擴展呢?”
??????? 小菜:“我已經把業務和界面分離了呀,這不是很靈活了嗎?”
??????? 大鳥:“那我問你,現在如果我希望增加一個開根(sqrt)運算,你如何改?”
??????? 小菜:“那只需要改Operation類就行了,在switch中加一個分支就行了。”
??????? 大鳥:“問題是你要加一個平方根運算,卻需要把加減乘除的運算都得來參與編譯,如果你一不小心,把加法運算改成了減法,這不是大大的糟糕。打個比方,如果現在公司要求你為公司的薪資管理系統做維護,原來只有技術人員(月薪),市場銷售人員(底薪+提成),經理(年薪+股份)三種運算算法,現在要增加兼職工作人員的(時薪)算法,但按照你昨天的程序寫法,公司就必須要把包含有的原三種算法的運算類給你,讓你修改,你如果心中小算盤一打,‘TMD,公司給我的工資這么低,我真是郁悶,這會有機會了’,于是你除了增加了兼職算法以外,在技術人員(月薪)算法中寫了一句?

if (員工是小菜) {salary = salary * 1.1; }

那就意味著,你的月薪每月都會增加10%(小心被抓去坐牢),本來是讓你加一個功能,卻使得原有的運行良好的功能代碼產生了變化,這個風險太大了。你明白了嗎?”

????????小菜:“哦,你的意思是,我應該把加減乘除等運算分離,修改其中一個不影響另外的幾個,增加運算算法也不影響其它代碼,是這樣嗎?”
??????? 大鳥:“自己想去吧,如何用繼承和多態,你應該有感覺了。”
??????? 小菜:“OK,我馬上去寫。”

/// <summary>/// 運算類/// </summary>class Operation{private double _numberA = 0;private double _numberB = 0;/// <summary>/// 數字A/// </summary>public double NumberA{get{ return _numberA; }set{ _numberA = value;}}/// <summary>/// 數字B/// </summary>public double NumberB{get{ return _numberB; }set{ _numberB = value; }}/// <summary>/// 得到運算結果/// </summary>/// <returns></returns>public virtual double GetResult(){double result = 0; return result;}}

/// <summary>/// 加法類/// </summary>class OperationAdd : Operation{public override double GetResult(){double result = 0; result = NumberA + NumberB;return result;}}/// <summary>/// 減法類/// </summary>class OperationSub : Operation{public override double GetResult(){double result = 0;result = NumberA - NumberB;return result;}}/// <summary>/// 乘法類/// </summary>class OperationMul : Operation{public override double GetResult(){double result = 0;result = NumberA * NumberB;return result;}}/// <summary>/// 除法類/// </summary>class OperationDiv : Operation{public override double GetResult(){double result = 0;if (NumberB==0)throw new Exception("除數不能為0。");result = NumberA / NumberB;return result;}}

????????小菜:“大鳥哥,我按照你說的方法寫出來了一部分,首先是一個運算類,它有兩個Number屬性,主要用于計算器的前后數,然后有一個虛方法GetResult(),用于得到結果,然后我把加減乘除都寫成了運算類的子類,繼承它后,重寫了GetResult()方法,這樣如果要修改任何一個算法,都不需要提供其它算法的代碼了。但問題來了,我如何讓計算器知道我是希望用哪一個算法呢?”
??????? 大鳥:“寫得很不錯嗎,大大超出我的想象了,你現在的問題其實就是如何去實例化對象的問題,哈,今天心情不錯,再教你一招‘簡單工廠模式’,也就是說,到底要實例化誰,將來會不會增加實例化的對象(比如增加開根運算),這是很容易變化的地方,應該考慮用一個單獨的類來做這個創造實例的過程,這就是工廠,來,我們看看這個類如何寫。”

/// <summary>/// 運算類工廠/// </summary>class OperationFactory{public static Operation createOperate(string operate){Operation oper = null;switch (operate){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.createOperate("+"); oper.NumberA = 1; oper.NumberB = 2; double result = oper.GetResult();

?大鳥:?“哈,界面的實現就是這樣的代碼,不管你是控制臺程序,Windows程序,Web程序,PDA或手機程序,都可以用這段代碼來實現計算器的功能,當有一天我們需要更改加法運算,我們只需要改哪里?”

??????? 小菜:“改OperationAdd 就可以了。”
??????? 大鳥:?“那么我們需要增加各種復雜運算,比如平方根,立方根,自然對數,正弦余弦等,如何做?”
??????? 小菜:“只要增加相應的運算子類就可以了呀。”
??????? 大鳥:?“嗯?夠了嗎?”
??????? 小菜:“對了,還需要去修改運算類工廠,在switch中增加分支。”
??????? 大鳥:?“哈,那才對,那如果要修改界面呢?”
??????? 小菜:“那就去改界面呀,關運算什么事呀。”
????????小菜:“?回想那天我面試題寫的代碼,我終于明白我為什么寫得不成功了,原來一個小小的計算器也可以寫出這么精彩的代碼,謝謝大鳥。”

(下為當時面試題時小菜所寫代碼,見《小菜編程成長記(一)》)

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 = Convert.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.WriteLine("結果是:" + D);} }

??????? 大鳥:?“吼吼,記住哦,編程是一門技術,更加是一門藝術,不能只滿足于寫完代碼運行結果正確就完事,時常考慮如何讓代碼更加簡煉,更加容易維護,容易擴展和復用,只有這樣才可以是真的提高。寫出優雅的代碼真的是一種很爽的事情。不過學無止境,其實這才是理解面向對象的開始呢。給你出個作業,做一個商場收銀軟件,營業員根據客戶購買商品單價和數量,向客戶收費。”
??????? 小菜:“就這個?沒問題呀。”

(待續)

出處:http://www.cnblogs.com/cj723/archive/2006/09/23/512430.html

總結

以上是生活随笔為你收集整理的大话设计模式(五 体会简单工厂模式的美妙)的全部內容,希望文章能夠幫你解決所遇到的問題。

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