소프트웨어 개발에서 디자인 패턴은 문제를 해결하기 위한 일반적인 접근 방식을 제공합니다. 그 중에서도 전략 디자인 패턴은 알고리즘을 캡슐화하고, 클라이언트가 런타임에 알고리즘을 선택할 수 있도록 해줍니다. 이 글에서는 루비에서 전략 디자인 패턴을 어떻게 구현하고 활용할 수 있는지에 대해 알아보겠습니다.
전략 디자인 패턴은 객체 지향 프로그래밍에서 알고리즘을 정의하고, 이를 캡슐화하여 서로 교환 가능하게 만드는 패턴입니다. 이 패턴을 사용하면 클라이언트 코드가 알고리즘의 구체적인 구현에 의존하지 않게 되어, 코드의 유연성과 재사용성을 높일 수 있습니다.
전략 패턴은 다음과 같은 세 가지 주요 구성 요소로 이루어져 있습니다:
이제 루비에서 전략 디자인 패턴을 어떻게 구현할 수 있는지 살펴보겠습니다. 예를 들어, 다양한 할인 전략을 적용하는 쇼핑 카트를 만들어 보겠습니다.
먼저, 할인 전략을 정의하는 인터페이스를 만들어 보겠습니다.
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.