初次接觸裝飾器

前言

前幾天老師在優化重構個人代碼的時候用到了裝飾器,感受裝飾器是一個頗有用的東西,在看學長的博客的時候也涉及裝飾器,因此在這裏講一下我對裝飾器的初步理解。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;
        }

效果是這樣的
image.png
咱們發現,上述代碼中用到的同一個函數Columns.AddColumns.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函數的裝飾。測試

結語

實踐中才能對知識理解的更深,當我寫代碼的時候想到用裝飾器的時候,就說明我真正理解裝飾器了。優化

相關文章
相關標籤/搜索