一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情
前言
- 小时候刚学会走路后我们是不是就开始学习如何穿衣吃饭了。不知道你有没有想过穿衣需要啥水平吗。有的人说穿衣不需要水平。我想说的事你错了。
- 先穿上衣再穿裤子这个倒是无所谓的,但是如果你先穿鞋子在穿袜子这是不是就有点过分了呢。而且穿鞋子和穿袜子时两个单独的行为双方不会有任何的干涉,只是在穿戴着开来必须先袜子后鞋子。
场景
如果你希望在无需修改代码的情况下即可使用对象, 且希望在运行时为对象新增额外的行为, 可以使用装饰模式。
- 装饰能将业务逻辑组织为层次结构, 你可为各层创建一个装饰, 在运行时将各种不同逻辑组合成对象。 由于这些对象都遵循通用接口, 客户端代码能以相同的方式使用这些对象。
如果用继承来扩展对象行为的方案难以实现或者根本不可行, 你可以使用该模式。
- 许多编程语言使用
final最终关键字来限制对某个类的进一步扩展。 复用最终类已有行为的唯一方法是使用装饰模式: 用封装器对其进行封装。
最初的业务逻辑类仅能读取和写入纯文本的数据。 此后, 我们创建了几个小的封装器类, 以便在执行标准操作后添加新的行为。
第一个封装器负责加密和解密数据, 而第二个则负责压缩和解压数据。
你甚至可以让这些封装器嵌套封装以将它们组合起来。
总结
装饰和代理有着相似的结构, 但是其意图却非常不同。 这两个模式的构建都基于组合原则, 也就是说一个对象应该将部分工作委派给另一个对象。 两者之间的不同之处在于代理 通常自行管理其服务对象的生命周期, 而装饰 的生成则总是由客户端进行控制。