装饰器模式&&ES7 Decorator 装饰器
装饰器模式(Decorator Pattern)允许向一个现有的对象动态添加新的功能,同时又不改变其结构。相比JavaScript中通过鸡肋的继承来给对象增加功能来说,装饰器模式相比生成子类更为灵活。
装饰模式和适配器模式都是 包装模式 (Wrapper Pattern),它们都是通过封装其他对象达到设计的目的的,但是它们的形态有很大区别。
适配器模式我们使用的场景比较多,比如连接不同数据库的情况,你需要包装现有的模块接口,从而使之适配数据库 —— 好比你手机使用转接口来适配插座那样;
装饰模式不一样,仅仅包装现有的模块,使之 “更加华丽” ,并不会影响原有接口的功能 —— 好比你给手机添加一个外壳罢了,并不影响手机原有的通话、充电等功能;
下面通过一个实例介绍装饰器模式的使用方法。孙悟空一出生虽然不同寻常,但也是只普通的猴子
- 首先创建一个普通猴子对象
- 接着创建一个装饰器'类'
- 创建具体的装饰器对象
接下来我们要为每一个功能创建一个装饰者对象,重写父级方法,添加我们想要的功能。该装饰器对象继承自装饰器'类',也接收monkey实例作为参数。
1.找菩提祖师学72变
2.找东海龙王要金箍棒
3.太上老君炼丹炉练就火眼金睛
- 使用装饰器装饰泼猴
装饰者模式是保持对象功能差异性的一种很好的方式,从长远来看有助于提高代码的可维护性。
在 ES6 中增加了对类对象的相关定义和操作(比如 class 和 extends ),这就使得我们在多个不同类之间共享或者扩展一些方法或者行为的时候,变得并不是那么优雅。这个时候,我们就需要一种更优雅的方法来帮助我们完成这些事情。
装饰器最早是在 python 2.4 里增加的功能,它的主要作用与装饰者模式类似,是给一个已有的方法或类扩展一些新的行为,而不是去直接修改它本身。
这里的 @decorator 就是我们说的装饰器。上面的代码中利用装饰器给目标方法执行前打印出了一行文本,并且并没有对原方法做任何的修改。ES7中的装饰器借鉴了Python的思想,实现方法也类似
ES6+的这种语法实际上是一种语法糖,而实际上当我们给一个类添加一个属性的时候,会调用到 Object.defineProperty 这个方法,它会接受三个参数:target 、name 和 descriptor ,所以上面的代码在未添加装饰器时解析成ES5是这样的:
在加上装饰器后,会在执行第二步的时候安装上这个装饰器(可以看成把这个步骤分成了两小步),通过执行装饰器函数返回一个descriptor属性描述符
当装饰器作用于类属性方法时,参数中的target
为类的原型,装饰器还可以作用于类本身,此时的target
参数是类本身。
装饰器函数还可以是一个工厂函数,可以传递参数
有了前面的基础,可以使用ES7的decorator实现一开始的装饰器模型。
要运行上述代码还需要babel转译
1.安装基础依赖包
运行方法一:命令行操作
运行方法二:require hook
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现