持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情
估计大家可能和我的感觉一样,感觉设计模式大多用在框架的源码中常见,但是自己工作中的业务代码里基本不会涉及到设计模式,也不会过多地考虑到使用涉及模式的事情。
其实针对很多业务场景,我们都可以应用设计模式。但是因为种种原因,比如说业务比较简单,亦或者业务场景对于应用设计模式抽象起来比较难等等。
这篇文章就比较好了,看完之后就可以试着直接把装饰模式加入到自己的项目中。
对于装饰模式我们日常中使用场景很频繁,从名字我们可以推断出,就是将一个类或者说对象进行装饰,以完成我们既定的功能。
相关概念
装饰器模式又名包装(Wrapper)模式。装饰器模式以对客户端透明的方式拓展对象的功能,是继承关系的一种替代方案。客户端不需要知道即将访问的对象内部做了什么,只知道访问它可以获取到对应的数据即可。
更进一步说,装饰器模式通过对客户透明的方式动态的给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰器模式可以在不是用创造更多子类的情况下,将对象的功能加以拓展。
对于装饰模式,纯纯的装饰模式找不太到,大多数的装饰模式的实现都是“半透明”的,而不是完全透明的。
这个怎么理解呢,就是说,允许装饰模式改变接口,增加新的方法。然而半透明的装饰模式是介于装饰模式和适配器模式之间的。适配器模式的操作意图是改变所考虑的类的接口,也可以通过改写几个方法,或增加新的方法来增强或改变所考虑的类的功能。
大多数的装饰模式实际上是半透明的装饰模式,这样的装饰模式也称做半装饰、半适配器模式。
使用场景
都说装饰器模式是继承的有力补充,比继承更加灵活,因为它可以在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用。同时我们可以通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果。
装饰器模式完全遵守开闭原则,即对扩展开放,对修改封闭。
用通俗的话来说,装饰器模式就是给原来“平平无奇”的类创建的对象对象动态地添加一些额外的职责。
何时使用:
- 需要扩展一个类的功能,在给一个类增加附加责任的时候。
- 需要动态的给一个对象增加新的功能,同时这些功能可以再动态地撤销。
- 需要增加一些基本功能的排列组合而产生的大量的新功能,但是这种对于通过继承实现会变得不现实。
我们发现,使用场景都在围绕着“动态”展开,所以说,装饰模式在使用的时候要利用好它的“动态”的特性。
总结
此文我们主要围绕着“装饰器模式”的概念展开介绍,接下来会具体讲解装饰器模式的应用。概念可能看起来理解不是太直观,但是这些也是我们必须要掌握的东西。