Патерн Декоратор є одним з найпопулярніших структурних патернів проектування, який дозволяє динамічно додавати нові функціональні можливості до об'єктів, не змінюючи їх структуру. У цій статті ми розглянемо, як реалізувати патерн Декоратор у Ruby, на прикладах та з поясненнями.
Патерн Декоратор дозволяє "обгортати" об'єкти, додаючи нові функції або змінюючи їх поведінку. Це особливо корисно, коли потрібно розширити функціональність об'єкта без зміни його коду. Декоратори можуть бути використані для додавання нових методів, зміни існуючих або навіть для зміни способу, яким об'єкт взаємодіє з іншими об'єктами.
Давайте розглянемо, як реалізувати патерн Декоратор у Ruby на простому прикладі. Уявімо, що у нас є базовий клас, який представляє напій, і ми хочемо додати до нього різні добавки, такі як молоко або цукор.
Спочатку створимо базовий клас для напою:
class Beverage def cost raise NotImplementedError, 'You must implement the cost method' end def description 'Unknown Beverage' end end
Цей клас є абстрактним і містить методи cost
та description
, які ми будемо реалізовувати в підкласах.
Тепер створимо кілька конкретних класів напоїв:
class Coffee < Beverage def cost 5.0 end def description 'Coffee' end end class Tea < Beverage def cost 3.0 end def description 'Tea' end end
Тепер у нас є два класи, Coffee
та Tea
, які реалізують методи cost
та description
.
Тепер ми можемо створити декоратори для додавання нових функцій до наших напоїв. Декоратор буде також успадковувати від класу Beverage
:
class MilkDecorator < Beverage def initialize(beverage) @beverage = beverage end def cost @beverage.cost + 1.0 end def description @beverage.description + ', Milk' end end class SugarDecorator < Beverage def initialize(beverage) @beverage = beverage end def cost @beverage.cost + 0.5 end def description @beverage.description + ', Sugar' end end
У цих класах ми приймаємо об'єкт напою в конструкторі та зберігаємо його в змінній @beverage
. Потім ми перевизначаємо методи cost
та description
, щоб додати вартість та опис добавки.
Тепер, коли ми маємо наші класи, давайте подивимося, як їх використовувати:
# Створюємо простий напій beverage = Coffee.new puts "#{beverage.description} costs #{beverage.cost}" # Додаємо молоко beverage_with_milk = MilkDecorator.new(beverage) puts "#{beverage_with_milk.description} costs #{beverage_with_milk.cost}" # Додаємо цукор beverage_with_milk_and_sugar = SugarDecorator.new(beverage_with_milk) puts "#{beverage_with_milk_and_sugar.description} costs #{beverage_with_milk_and_sugar.cost}"
Вивід програми буде таким:
Coffee costs 5.0 Coffee, Milk costs 6.0 Coffee, Milk, Sugar costs 6.5
Патерн Декоратор є потужним інструментом для розширення функціональності об'єктів у Ruby. Він дозволяє вам динамічно додавати нові можливості, не змінюючи існуючий код. Використовуючи декоратори, ви можете створювати гнучкі та розширювані системи, які легко підтримувати та модифікувати.
Сподіваємося, що ця стаття допомогла вам зрозуміти, як реалізувати патерн Декоратор у Ruby. Тепер ви можете використовувати його у своїх проектах для покращення структури та гнучкості вашого коду!
© 2024 RailsInsights. All rights reserved.