Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Nâng cao đối tượng Ruby với mẫu Decorator: Hướng dẫn thực hành

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.

Nâng cao đối tượng Ruby với mẫu Decorator: Hướng dẫn thực hành

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 🙂