前几天老师在优化重构个人代码的时候用到了装饰器,感受装饰器是一个颇有用的东西,在看学长的博客的时候也涉及装饰器,因此在这里讲一下我对装饰器的初步理解。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
函数的装饰。测试
实践中才能对知识理解的更深,当我写代码的时候想到用装饰器的时候,就说明我真正理解装饰器了。优化