日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
淺談.NET獨(dú)有精巧泛型設(shè)計(jì)模式

雖然泛型出現(xiàn)已有多年,連Java都早已借鑒引入了泛型(雖然是語(yǔ)法糖),可是用泛型的編程思維方式并沒(méi)有得到相應(yīng)的普及。一方面是由于過(guò)去大量的Framework仍然是在非泛型時(shí)代寫(xiě)成的,另一方面泛型的設(shè)計(jì)模式?jīng)]有得到發(fā)展,改變的時(shí)候該到了。

創(chuàng)新互聯(lián)公司專(zhuān)注于焦作網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供焦作營(yíng)銷(xiāo)型網(wǎng)站建設(shè),焦作網(wǎng)站制作、焦作網(wǎng)頁(yè)設(shè)計(jì)、焦作網(wǎng)站官網(wǎng)定制、微信平臺(tái)小程序開(kāi)發(fā)服務(wù),打造焦作網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供焦作網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。

來(lái)舉一個(gè)例子說(shuō)明這兩點(diǎn)。我們?nèi)绻麑?xiě)過(guò)網(wǎng)絡(luò)數(shù)據(jù)抓取的代碼,應(yīng)該熟悉這樣的代碼:

 
 
 
  1. var request = WebRequest.Create("http://www.cnblogs.com/") as HttpWebRequest; 

或者這么寫(xiě),也是一樣:

 
 
 
  1. var request = HttpWebRequest.Create("http://www.cnblogs.com/") as HttpWebRequest; 

大家可想過(guò),為什么每次都要as一下?

類(lèi)似的情況還有,比如做圖像處理的弟兄會(huì)熟悉:

 
 
 
  1. var bm = Image.FromFile("e:\\me.jpg") as Bitmap; 

 
 
 
  1. var bm = Bitmap.FromFile("e:\\me.jpg") as Bitmap; 

我想過(guò),但沒(méi)想明白。上面兩種寫(xiě)法,都是調(diào)用父類(lèi)的工廠方法,實(shí)際返回了一個(gè)子類(lèi)的實(shí)例。顯然,即使不了解OCP,憑直覺(jué)也應(yīng)該想到,父類(lèi)的實(shí)現(xiàn)中不應(yīng)該被子類(lèi)所決定。寫(xiě)WebRequest和Image的前輩可能也覺(jué)得直接返回子類(lèi)實(shí)例不妥,所以陰險(xiǎn)地把方法簽名的返回類(lèi)型改成了父類(lèi)。

雖然這種行徑值得嚴(yán)重鄙視。但.NET程序員大都是人云亦云,照葫蘆畫(huà)瓢的好學(xué)生,所以這個(gè)問(wèn)題多年了也沒(méi)有修改。

理想的設(shè)計(jì)應(yīng)該是這樣:父類(lèi)的每個(gè)子類(lèi),都有獨(dú)立的工廠方法,返回其自身的實(shí)例。這樣做法,在泛型出現(xiàn)前非常笨拙,得不償失,但有了泛型,就可以精巧地實(shí)現(xiàn)。

以模擬Image類(lèi)為例,Image和BitMap實(shí)現(xiàn)如下:

 
 
 
  1. class Image where T:Image, new()  
  2. {  
  3.     public string Path { get; set; }  
  4.  
  5.     public static T FromFile(string path)  
  6.     {  
  7.         return new T() { Path = path };  
  8.     }  
  9. }  
  10.  
  11. class Bitmap:Image  
  12. {  

Image自身的工廠方法,就沒(méi)有存在的必要了。

可以簡(jiǎn)單地測(cè)試一下:

 
 
 
  1. var path = @"e:\me.jpg";  
  2. var bm = Bitmap.FromFile(path); ;  
  3.  
  4. Console.WriteLine(bm.Path);  
  5. Console.WriteLine(bm.GetType().Name); 

輸出結(jié)果如下:

 
 
 
  1. Path: e:\me.jpg  
  2. Type: Bitmap 

為了讓大家更熟悉一下,再舉一個(gè)實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)中的二叉樹(shù)作例子。

傳統(tǒng)的樹(shù)節(jié)點(diǎn)類(lèi),無(wú)論無(wú)論C/C++/Java都是類(lèi)似這樣:

 
 
 
  1. class TreeNode  
  2. {  
  3.     public TreeNode LeftChild { get; set; }  
  4.     public TreeNode RightChild { get; set; }  
  5.     public TreeNode Parent { get; set; }  
  6.     public int Value { get; set; }  

大家知道,二叉樹(shù)又分好幾種,AVL樹(shù)、B樹(shù)、紅黑樹(shù)等等。實(shí)現(xiàn)特殊的二叉樹(shù)數(shù)據(jù)結(jié)構(gòu),勢(shì)必要繼承TreeNode。由于樹(shù)節(jié)點(diǎn)的類(lèi)型中,有類(lèi)型為基類(lèi)的成員,所以在子類(lèi)操作這些成員時(shí),往往也要強(qiáng)制轉(zhuǎn)換類(lèi)型,這比Image和WebRequest的例子,只在實(shí)例創(chuàng)建時(shí)轉(zhuǎn)換類(lèi)型還麻煩。

這就該泛型模式一顯身手的好機(jī)會(huì)了,請(qǐng)看其父類(lèi)型的實(shí)現(xiàn):

 
 
 
  1. /// Type of the node.  
  2. /// Type of the node value.  
  3. class TreeNode where T:TreeNode where K: IComparable  
  4. {  
  5.     public T LeftChild { get; set; }  
  6.     public T RightChild { get; set; }  
  7.     public T Parent { get; set; }  
  8.     public K Value { get; set; }  

之后,實(shí)現(xiàn)任何一種特殊二叉樹(shù)結(jié)構(gòu),比如RBTreeNode代表紅黑樹(shù)節(jié)點(diǎn),可以這樣:

 
 
 
  1. class RBTreeNode : TreeNode  
  2. {  
  3.     ///   
  4.     /// 樹(shù)節(jié)點(diǎn)顏色,是否為紅。  
  5.     ///   
  6.     public bool IsRed { get; set; }  
  7.  
  8.     public override string ToString()  
  9.     {  
  10.         return this.Value + "," + (this.IsRed ? "R" : "B");  
  11.     }  

這個(gè)是AVL樹(shù):

 
 
 
  1. class AvlTreeNode : TreeNode  
  2. {  
  3.     ///   
  4.     /// 節(jié)點(diǎn)的平衡度  
  5.     ///   
  6.     public int Balance { get; set; }  
  7.  
  8.     public override string ToString()  
  9.     {  
  10.         return "Balance: " + Balance + ", Value: " + this.Value;  
  11.     }  

不但完全符合OCP原則,而且再也不需要as來(lái)強(qiáng)制轉(zhuǎn)換節(jié)點(diǎn)類(lèi)型了。

這肯定不是我的首創(chuàng),其實(shí).NET Framework中已經(jīng)不少這樣的設(shè)計(jì),比如IComparable接口。也有不少優(yōu)秀的框架采用了類(lèi)似的設(shè)計(jì),比如大石頭同學(xué)的ORM框架NewLife.XCode。

看上去也很簡(jiǎn)單吧,但是很多人思維還停留在面向?qū)ο笳Z(yǔ)言剛誕生的階段,還不習(xí)慣用這種設(shè)計(jì)模式。我認(rèn)為這種寫(xiě)法足夠典型和通用,足以得上一種設(shè)計(jì)模式,而且是.NET特殊優(yōu)勢(shì),獨(dú)特魅力。

說(shuō)到設(shè)計(jì)模式,其實(shí)GOF提出的23種設(shè)計(jì)模式多年了,已經(jīng)過(guò)時(shí),出現(xiàn)了許多新模式(比如并發(fā)編程方面,參考Wiki Design Pattern)。舊有的模式中,有的已經(jīng)包含在.NET語(yǔ)言特性中,有的模式實(shí)現(xiàn)方式已經(jīng)改頭換面。尤其在泛型出現(xiàn)后,許多模式的實(shí)現(xiàn)可以變得簡(jiǎn)潔許多,優(yōu)雅許多。

不要一遍遍炒過(guò)去的冷飯,設(shè)計(jì)模式應(yīng)該與時(shí)俱進(jìn),永遠(yuǎn)是充滿(mǎn)新鮮活力的話(huà)題。

原文來(lái)自:http://www.cnblogs.com/XmNotes/archive/2012/04/23/2466938.html

【編輯推薦】

  1. 為什么我不再做.NET開(kāi)發(fā)
  2. 詳細(xì)解讀ASP.NET的異步
  3. ASP.NET的路由系統(tǒng):URL與物理文件的分離
  4. ASP.NET MVC3 從零開(kāi)始一步步構(gòu)建Web
  5. Node.js vs Opa: Web框架殺手

本文題目:淺談.NET獨(dú)有精巧泛型設(shè)計(jì)模式
網(wǎng)址分享:http://www.5511xx.com/article/dhjojcg.html