💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 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`类的功能,而不会弄乱它。