如何分析.NET獨(dú)有精巧泛型設(shè)計(jì)模式

如何分析.NET獨(dú)有精巧泛型設(shè)計(jì)模式,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

“專業(yè)、務(wù)實(shí)、高效、創(chuàng)新、把客戶的事當(dāng)成自己的事”是我們每一個(gè)人一直以來堅(jiān)持追求的企業(yè)文化。 成都創(chuàng)新互聯(lián)公司是您可以信賴的網(wǎng)站建設(shè)服務(wù)商、專業(yè)的互聯(lián)網(wǎng)服務(wù)提供商! 專注于成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、軟件開發(fā)、設(shè)計(jì)服務(wù)業(yè)務(wù)。我們始終堅(jiān)持以客戶需求為導(dǎo)向,結(jié)合用戶體驗(yàn)與視覺傳達(dá),提供有針對(duì)性的項(xiàng)目解決方案,提供專業(yè)性的建議,創(chuàng)新互聯(lián)建站將不斷地超越自我,追逐市場(chǎng),引領(lǐng)市場(chǎng)!

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

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

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

或者這么寫,也是一樣:

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

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

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

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

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

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

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

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

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

class Image<T> where T:Image<T>, new()  {      public string Path { get; set; }       public static T FromFile(string path)      {          return new T() { Path = path };      }  }   class Bitmap:Image<Bitmap>  {  }

Image自身的工廠方法,就沒有存在的必要了。

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

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

輸出結(jié)果如下:

Path: e:\me.jpg  Type: Bitmap

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

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

class TreeNode  {      public TreeNode LeftChild { get; set; }      public TreeNode RightChild { get; set; }      public TreeNode Parent { get; set; }      public int Value { get; set; }  }

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

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

/// <typeparam name="T">Type of the node.</typeparam>  /// <typeparam name="K">Type of the node value.</typeparam>  class TreeNode<T,K> where T:TreeNode<T,K> where K: IComparable<K>  {      public T LeftChild { get; set; }      public T RightChild { get; set; }      public T Parent { get; set; }      public K Value { get; set; }  }

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

class RBTreeNode : TreeNode<RBTreeNode,Int32>  {      /// <summary>      /// 樹節(jié)點(diǎn)顏色,是否為紅。      /// </summary>      public bool IsRed { get; set; }       public override string ToString()      {          return this.Value + "," + (this.IsRed ? "R" : "B");      }  }

這個(gè)是AVL樹:

class AvlTreeNode : TreeNode<AvlTreeNode,Int32>  {      /// <summary>      /// 節(jié)點(diǎn)的平衡度      /// </summary>      public int Balance { get; set; }       public override string ToString()      {          return "Balance: " + Balance + ", Value: " + this.Value;      }  }

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

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

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

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

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。

本文標(biāo)題:如何分析.NET獨(dú)有精巧泛型設(shè)計(jì)模式
本文鏈接:http://www.muchs.cn/article18/ishjdp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、品牌網(wǎng)站制作、微信公眾號(hào)、網(wǎng)站收錄、、App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)