编程模式之装饰器模式
这是一个系列贴,以后都会分享一些编程的技巧,以及思路
编程模式是不分语言的,他是一种思想,思路,更高级的抽象,适用于所有图灵完备的语言
往期帖子
什么是装饰器
在运行期间在不改变函数或方法原型原有的操作的情况下增加额外的动作的函数或者方法就可以叫做装饰器
是不是有点绕?
先看看一个生活中的例子
一天早上bulabula童鞋要去公司上班,平常他都是走路上班,但是今天突然天空乌云密布,大雨倾盆而下,他没办法只能打了一的士躲避雨点的袭击去上班,过了一会儿bulabula打到车安然无恙到达公司照常上班,可喜可贺,可喜可贺😋
注意加粗的关键语句,可以不往下看先自己想想这些语句是为什么要加粗~
举完了例子,来讲解一下这个例子跟装饰器有什么关系
例子中,bulabula这个人因为下雨这个突发事件打了的士遮雨然后再去公司
转换过来就是,一个函数在突然的需求下,使用装饰器添加了额外的动作完成需求的同时应付了突发事件
python的装饰器
这个add是一个函数,这个函数负责把两个数相加并且返回它们的结果
你在开发的时候用得好好的,但是组长这个时候来了个要求,需要你在调用函数的时候要打印函数的名称以及参数分别是什么
这个时候你就这样写了
运行一下
好的完美符合需求
但是你看了一眼你其他的函数
妈的,怎么那么吊多!要我写多少遍!艹!老子不干了!😡
然后你就离职了然后你就因为没有了收入饿死了😭
你突然惊醒,原来是你要写的函数太多太累了不小心睡着了,你有点后怕,但是需求并不是梦,你只能苦逼的一个一个的写上😭
在你准备要写的时候你看到了bulabula的帖子《编程模式之装饰器模式》你欣喜若狂照着写了一个装饰器然后给每个函数都装饰上
然后运行
完美的运行成功,皆大欢喜,组长看到你那么快就完成了需求,就给你申请了奖金皆大欢喜,皆大欢喜~😋
好了回到整体,这个文中装饰器在python中是什么意思呢
这里定义了一个函数叫log接受一个fn的参数,这个fn是一个需要是一个函数类型,然后在函数里定义了一个warp的函数,这个函数有两个参数,这两个参数是接受后传给fn的,然后再打印函数的参数,还有传进来的fn函数的实际上的函数命,再返回fn这个函数的值,然后log的函数则把这个warp函数返回出去
要使用它只需要在声明一个函数的时候在上一行写上@
并加上log
装饰器的名字即可,这是个语法糖
这样,只要调用这个add函数,python的解析器就会把add传入log中,然后再把实参传进去再执行
这个语法糖等价于这个写法
js的装饰器
js的装饰器的语法糖还在立项中,所以并没有相应的语法支持(ts有😋 )
在一些比较新的标准中可以使用,但是并不通用,请自行查阅相关资料
以下是实现装饰器的例子
结语
总结一下,回顾我举的生活中的例子
bulabula就是一个人类代表着类似的函数
下雨就是突发的情况,甲方,组长还有要设计的一些需求
的士就是一个装饰器,能给函数方法装饰,但是也是不是什么都能装饰,的士只能坐人,但是坐不了大象,坐不进,坐不了狗子(别杠),例子中的那些例子也只能装饰只有两个参数的返回值,在其他语言里还有类型的限制,所以还得根据需求还有函数方法原型来设计装饰器,就很考验开发者的实力了
下一篇,跟装饰器很像的代理模式~😋
和面向切面编程有些类似啊,都是在不改变原函数的情况下对功能做增强
看的时候,俺懂,简单,看完了,脑子也忘光了