소프트웨어 개발에서 디자인 패턴은 코드의 재사용성과 유지보수성을 높이는 데 큰 도움이 됩니다. 그 중에서도 옵저버 패턴은 객체 간의 일대다 관계를 정의하여 한 객체의 상태 변화가 다른 객체에 자동으로 통지되도록 하는 패턴입니다. 이 글에서는 루비에서 옵저버 패턴을 어떻게 구현할 수 있는지에 대해 알아보겠습니다.
옵저버 패턴은 주로 이벤트 기반 시스템에서 사용됩니다. 이 패턴을 사용하면 한 객체(주체)의 상태가 변경될 때, 그 객체에 의존하는 다른 객체들(옵저버)에게 자동으로 알림을 보낼 수 있습니다. 이를 통해 객체 간의 결합도를 낮추고, 시스템의 유연성을 높일 수 있습니다.
옵저버 패턴은 다음과 같은 주요 구성 요소로 이루어져 있습니다:
이제 루비에서 옵저버 패턴을 구현해보겠습니다. 간단한 예제로 주체가 온도를 나타내고, 옵저버가 온도 변화에 반응하는 시스템을 만들어보겠습니다.
먼저 주체 클래스를 구현합니다. 이 클래스는 옵저버를 등록하고, 상태가 변경될 때 옵저버에게 알림을 보내는 기능을 포함합니다.
class Temperature def initialize @observers = [] @temperature = 0 end def add_observer(observer) @observers << observer end def remove_observer(observer) @observers.delete(observer) end def temperature=(value) @temperature = value notify_observers end def notify_observers @observers.each { |observer| observer.update(@temperature) } end end
다음으로 옵저버 클래스를 구현합니다. 이 클래스는 주체의 상태 변화에 반응하는 메서드를 포함합니다.
class TemperatureDisplay def update(temperature) puts "현재 온도: #{temperature}도" end end
이제 주체와 옵저버를 연결하여 옵저버 패턴을 사용할 수 있습니다. 아래의 코드를 통해 주체의 온도를 변경할 때마다 옵저버가 알림을 받는 모습을 확인할 수 있습니다.
# 주체와 옵저버 인스턴스 생성 temperature = Temperature.new display = TemperatureDisplay.new # 옵저버 등록 temperature.add_observer(display) # 온도 변경 temperature.temperature = 25 temperature.temperature = 30
위 코드를 실행하면 다음과 같은 출력이 나타납니다:
현재 온도: 25도 현재 온도: 30도
옵저버 패턴을 사용하면 다음과 같은 장점을 누릴 수 있습니다:
하지만 옵저버 패턴에도 단점이 존재합니다:
이번 글에서는 루비에서 옵저버 패턴을 구현하는 방법에 대해 알아보았습니다. 옵저버 패턴은 객체 간의 관계를 유연하게 만들어주며, 다양한 상황에서 유용하게 사용될 수 있습니다. 하지만 성능과 복잡성 문제를 고려하여 적절한 상황에서 사용하는 것이 중요합니다. 여러분의 프로젝트에 옵저버 패턴을 적용해보세요!
© 2024 RailsInsights. All rights reserved.