## 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.策略模式
- 贊助商
- 捐
- 人們怎么說
- 版權
- 取得這本書