前幾天老師在優化重構個人代碼的時候用到了裝飾器,感受裝飾器是一個頗有用的東西,在看學長的博客的時候也涉及裝飾器,因此在這裏講一下我對裝飾器的初步理解。c#
在網上看到一個很好的例子。內褲能夠用來遮羞,可是到了冬天無法爲咱們防風禦寒,聰明的人發明了長褲,有了長褲後就不會冷了,裝飾器就像咱們所說的長褲,在不影響短褲做用的前提下,長褲爲咱們提供了保暖的功能,也就是說裝飾器在不影響原函數的功能下爲咱們提供了新功能。
學長對裝飾器的比喻也很好,他把裝飾器比喻成了咖啡店的服務生,我以爲咖啡有點苦,服務生把咖啡端走,給我帶來了咖啡和糖。具體連接以下http://www.javashuo.com/article/p-yuztiutj-bn.html
簡單來講,裝飾器會不影響原函數功能的狀況下添加新功能。segmentfault
裝飾器本質上也是一個函數,咱們知道,一個好的代碼應該是對修改關閉,對擴展開放,這裏說的應該就是裝飾器了。裝飾器可讓其餘函數再不須要任何代碼變更的前提下增長額外功能,它能夠用於插入日誌,性能測試,事務處理,緩存,權限校驗等場景,有了裝飾器,咱們就能夠抽離出大量與函數自己無關的雷同代碼並繼續重用。緩存
就拿我寫的程序舉例子,ListView
是c#的一個樣式2,咱們須要在ListView
最上部加入咱們的表格頭本來是這樣寫的函數
this.listView1.Columns.Add("學號", 100, HorizontalAlignment.Center); this.listView1.Columns.Add("姓名", 100, HorizontalAlignment.Center); this.listView1.Columns.Add("數學", 100, HorizontalAlignment.Center); this.listView1.Columns.Add("英語", 100, HorizontalAlignment.Center); this.listView1.Columns.Add("政治", 100, HorizontalAlignment.Center); this.listView1.Columns.Add("總分", 100, HorizontalAlignment.Center); this.listView1.Columns.Add("平均分", 100, HorizontalAlignment.Center); this.listView1.Columns.Add("名次", 100, HorizontalAlignment.Center); this.listView1.View = System.Windows.Forms.View.Details; }
效果是這樣的
咱們發現,上述代碼中用到的同一個函數Columns.Add
,Columns.Add
函數須要傳入3個變量,可是咱們發現後二個參數是相同的,變化的只有第一個參數,咱們能夠裝飾一下原函數性能
class YzListView { private ListView listView; private int width = 100; private HorizontalAlignment align = HorizontalAlignment.Center; public YzListView(ListView listView) { this.listView = listView; } public YzListView Add(string name) { return this.Add(name, this.width, this.align); } public YzListView Add(string name, int width) { return this.Add(name, width, this.align); } public YzListView Add(string name, int width, HorizontalAlignment align){ this.listView.Columns.Add(name, width, align); return this; } }
由於ListView
類的代碼是不能修改的,因此咱們定義一個新的類,並命名爲YzListView
,構造函數中要傳入ListView
,並做接收,咱們要對ListVIew
類中的Columns.Add
函數作裝飾。而後,咱們再去裝飾ListVIew
類中的Columns.Add
函數,經過對新定義的Add
函數中傳入的name
參數,一層一層的作調用,最後調用Columns.Add
函數,咱們就實現了對Columns.Add
函數的裝飾。測試
實踐中才能對知識理解的更深,當我寫代碼的時候想到用裝飾器的時候,就說明我真正理解裝飾器了。優化