## 31.装饰图案
装饰器模式允许动态扩展对象。 对于本部分,我们希望读者在此处 [https://docs.ruby-lang.org/en/2.7.0/SimpleDelegator.html](https://docs.ruby-lang.org/en/2.7.0/SimpleDelegator.html) 阅读有关`SimpleDelegator`的信息。 实际上,我们已经从 Ruby 文档中直接采用了本书中的示例。
看下面的程序,键入并执行它。
```rb
# decorator.rb
class User
def born_on
Time.new(1989, 9, 10)
end
end
class UserDecorator < SimpleDelegator
def birth_year
born_on.year
end
end
decorated_user = UserDecorator.new(User.new)
puts decorated_user.birth_year
puts decorated_user.__getobj__
puts decorated_user.class
```
输出量
```rb
1989
#<User:0x00005592d8d63470>
UserDecorator
```
现在让我们看看它是如何工作的。 首先,我们有一个名为`User`的类,它具有一个名为`born_on`的函数,该函数返回用户出生时的`Time`对象。 假设我们只想添加一个返回出生年份的功能,我们可以修改原始类`User`并添加一个仅返回出生年份的功能`birth_year`,或者我们可以使用装饰器来 扩展`User`的功能。
看一下这段代码
```rb
class UserDecorator < SimpleDelegator
def birth_year
born_on.year
end
end
```
在这里,我们创建一个名为`UserDecorator`的类,该类继承自`SimpleDelegator`,后者是内置的 Ruby 功能,可帮助我们构建装饰器。 在其中,我们编写了一个称为`birth_year`的函数,该函数仅返回出生年份。
现在,我们需要使用此语句将`User`扩展为`UserDecorator`
```rb
decorated_user = UserDecorator.new(User.new)
```
在此语句中,`decorated_user`是`UserDecorator`的实例,但它具有`User`和`UserDecorator`的所有方法。 因此,调用`decorated_user.birth_year`可以正常工作。 从理论上讲,我们已经扩展了`User`类的功能,而不会弄乱它。
- 前言
- 红宝石
- 先决条件
- 1.安装 Ruby
- 2.在线资源
- 3.入门
- 4.比较与逻辑
- 5.循环
- 6.数组
- 7.哈希和符号
- 8.范围
- 9.功能
- 10.可变范围
- 11.类&对象
- 12.安全导航
- 13.打破大型程序
- 14.结构和 OpenStruct
- 15. Rdoc
- 16. Ruby 样式指南
- 17.模块和混入
- 18.日期和时间
- 19.文件
- 20. Proc,Lambda 和块
- 21.多线程
- 22.异常处理
- 23.正则表达式
- 24.宝石
- 25.元编程
- 26.基准
- 27.测试驱动开发
- 28.观察者模式
- 29.模板模式
- 30.工厂模式
- 31.装饰图案
- 32.适配器模式
- 33.单例模式
- 34.复合模式
- 35.建造者模式
- 36.策略模式
- 赞助商
- 捐
- 人们怎么说
- 版权
- 取得这本书