初次接触装饰器

前言

前几天老师在优化重构个人代码的时候用到了装饰器,感受装饰器是一个颇有用的东西,在看学长的博客的时候也涉及装饰器,因此在这里讲一下我对装饰器的初步理解。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函数的装饰。测试

结语

实践中才能对知识理解的更深,当我写代码的时候想到用装饰器的时候,就说明我真正理解装饰器了。优化

相关文章
相关标签/搜索