소프트웨어 개발에서 디자인 패턴은 문제를 해결하기 위한 일반적인 접근 방식을 제공합니다. 그 중에서도 전략 디자인 패턴은 알고리즘을 캡슐화하고, 클라이언트가 런타임에 알고리즘을 선택할 수 있도록 해줍니다. 이 글에서는 루비에서 전략 디자인 패턴을 어떻게 구현하고 활용할 수 있는지에 대해 알아보겠습니다.
전략 디자인 패턴은 객체 지향 프로그래밍에서 알고리즘을 정의하고, 이를 캡슐화하여 서로 교환 가능하게 만드는 패턴입니다. 이 패턴을 사용하면 클라이언트 코드가 알고리즘의 구체적인 구현에 의존하지 않게 되어, 코드의 유연성과 재사용성을 높일 수 있습니다.
전략 패턴은 다음과 같은 세 가지 주요 구성 요소로 이루어져 있습니다:
이제 루비에서 전략 디자인 패턴을 어떻게 구현할 수 있는지 살펴보겠습니다. 예를 들어, 다양한 할인 전략을 적용하는 쇼핑 카트를 만들어 보겠습니다.
먼저, 할인 전략을 정의하는 인터페이스를 만들어 보겠습니다.
class DiscountStrategy
def apply_discount(price)
raise NotImplementedError, 'You must implement the apply_discount method'
end
end
이제 다양한 할인 전략을 구현해 보겠습니다. 예를 들어, 정액 할인과 비율 할인을 구현할 수 있습니다.
class FlatDiscount < DiscountStrategy
def initialize(discount_amount)
@discount_amount = discount_amount
end
def apply_discount(price)
price - @discount_amount
end
end
class PercentageDiscount < DiscountStrategy
def initialize(discount_percentage)
@discount_percentage = discount_percentage
end
def apply_discount(price)
price - (price * @discount_percentage / 100.0)
end
end
이제 할인 전략을 사용하는 쇼핑 카트 클래스를 만들어 보겠습니다.
class ShoppingCart
def initialize
@items = []
@discount_strategy = nil
end
def add_item(price)
@items << price
end
def set_discount_strategy(strategy)
@discount_strategy = strategy
end
def total_price
total = @items.reduce(0, :+)
total = @discount_strategy.apply_discount(total) if @discount_strategy
total
end
end
이제 위에서 정의한 클래스를 사용하여 할인 전략을 적용해 보겠습니다.
cart = ShoppingCart.new
cart.add_item(100)
cart.add_item(200)
puts "총 가격: #{cart.total_price}" # 총 가격: 300
# 정액 할인 적용
flat_discount = FlatDiscount.new(50)
cart.set_discount_strategy(flat_discount)
puts "할인 적용 후 가격: #{cart.total_price}" # 할인 적용 후 가격: 250
# 비율 할인 적용
percentage_discount = PercentageDiscount.new(10)
cart.set_discount_strategy(percentage_discount)
puts "할인 적용 후 가격: #{cart.total_price}" # 할인 적용 후 가격: 270
전략 디자인 패턴을 사용하면 다음과 같은 장점을 누릴 수 있습니다:
물론 전략 디자인 패턴에도 단점이 존재합니다:
전략 디자인 패턴은 알고리즘을 캡슐화하고, 클라이언트가 런타임에 알고리즘을 선택할 수 있도록 해주는 유용한 패턴입니다. 루비에서 이 패턴을 구현하는 방법을 살펴보았으며, 다양한 할인 전략을 적용하는 쇼핑 카트 예제를 통해 그 활용성을 보여주었습니다. 이 패턴을 통해 코드의 유연성과 재사용성을 높일 수 있으니, 여러분의 프로젝트에서도 적극적으로 활용해 보시기 바랍니다!
© 2024 RailsInsights. All rights reserved.