Mẫu thiết kế Decorator (Trang trí) là gì?
Và làm thế nào bạn có thể sử dụng mẫu này trong dự án Ruby của mình?
Mẫu thiết kế Decorator giúp bạn nâng cao một đối tượng bằng cách thêm khả năng mới cho nó mà không phải thay đổi class.
Hãy xem ví dụ!
Logging & Hiệu suất
Trong ví dụ này chúng ta đang thực hiện HTTP request bằng gem như rest-client.
Đây là trông như thế nào:
require 'restclient'
data = RestClient.get("www.rubyguides.com")
Bây giờ:
Giả sử chúng ta muốn thêm logging cho một số request, và chúng ta không muốn thay đổi module RestClient.
Chúng ta có thể làm điều này bằng mẫu Decorator.
Đây là module logging của chúng ta:
module LogHTTPRequest
def get(url)
puts "Sending Request For #{url}"
super
end
end
Điều này sẽ in thông tin chúng ta muốn ra màn hình sau đó gọi phương thức get gốc từ RestClient.
Để thêm khả năng logging cho một request bạn có thể dùng phương thức extend.
Như sau:
class HTTPClient
def initialize(client = RestClient)
@client = client
end
def get(*args)
@client.get(*args)
end
end
client = HTTPClient.new
client.extend(LogHTTPRequest)
client.get("rubyguides.com")
Bạn phải tạo class wrapper HTTPClient này vì RestClient là một module & bạn không thể tạo đối tượng từ module.
Khi nào sử dụng mẫu Decorator
Vẻ đẹp của mẫu này là bạn chỉ đang nâng cao một đối tượng, vì vậy bạn có thể có một client không logging & một client logging.
Lợi ích khác là bạn có thể xếp chồng các decorator này & có một cho performance testing, một cho logging, v.v.
Kết hợp các decorator sẽ không thể nếu bạn dùng kế thừa để tạo class HTTPClientWithLogging, và class HTTPClientWithPerformanceTesting.

Bạn không thể có WithLogging và WithPerformanceTesting cùng lúc trừ khi bạn tạo class này…
class HTTPClientWithLoggingAndPerformanceTesting # ... end
Mẫu Decorator giải quyết vấn đề này trong khi tránh trùng lặp mã & tên class điên rồ.
Video
Tóm tắt
Bạn đã học về mẫu thiết kế Decorator, mẫu này giúp bạn thêm khả năng mới cho đối tượng mà không phải thay đổi class.
Đừng thụ động! Bây giờ là lượt bạn thực hành & áp dụng khái niệm này. Nó sẽ giúp bạn nhớ khi cần thiết.
Chia sẻ bài viết này để nhiều người hơn có thể đọc 🙂