ConcreteStrategyA/B: 각각 오름차순과 내림차순 정렬 알고리즘을 구현합니다.
Context: 전략을 설정하고 사용하여 데이터를 처리합니다.
전략 패턴의 주요 장점은 알고리즘을 클라이언트 코드와 독립적으로 정의하고 교환할 수 있게 함으로써, 유지 보수성을 높이고 확장성을 제공합니다. 이를 통해 알고리즘이 변경되더라도 기존 코드의 수정 없이 쉽게 새로운 알고리즘으로 교체할 수 있습니다.
4. 옵저버 패턴 (Observer Pattern)
옵저버 패턴은 객체의 상태 변화에 따라 다른 객체들에게 자동으로 통보하는 방식입니다. 이벤트 기반 시스템에서 사용됩니다.
옵저버 패턴은 한 객체(주제 또는 주관자)의 상태 변화에 따라 여러 객체(옵저버)가 자동으로 업데이트되도록 하는 행동 패턴입니다. 즉, 주관자 객체가 상태를 변경하면 그와 연결된 옵저버들이 이를 감지하고 자신을 업데이트하게 됩니다.
옵저버 패턴의 구성 요소
옵저버 패턴은 주로 다음과 같은 세 가지 구성 요소로 이루어져 있습니다:
주관자 (Subject): 상태를 관리하고 옵저버를 등록 및 해제하며, 상태 변경 시 등록된 모든 옵저버에게 알립니다.
옵저버 (Observer): 주관자의 상태 변화를 감지하고 이에 대응하는 객체입니다. 상태 변화에 따라 자신의 상태를 업데이트하는 메서드를 구현해야 합니다.
구체적인 주관자 (Concrete Subject): 주관자 인터페이스를 구현한 클래스이며, 실제 상태를 저장하고 이를 변경할 수 있는 메서드를 가집니다.
구체적인 옵저버 (Concrete Observer): 옵저버 인터페이스를 구현한 클래스이며, 주관자의 상태 변화에 따라 자신의 상태를 업데이트하는 방법을 정의합니다.
사용 사례:
이벤트 처리 시스템
실시간 데이터 갱신
예제 코드:
class Subject:def__init__(self):self._observers = []def add_observer(self, observer):self._observers.append(observer)def remove_observer(self, observer):self._observers.remove(observer)def notify_observers(self, message):for observer inself._observers: observer.update(message)class Observer:def update(self, message):passclass ConcreteObserverA(Observer):def update(self, message):print(f"Observer A received: {message}")class ConcreteObserverB(Observer):def update(self, message):print(f"Observer B received: {message}")# 사용 예시subject = Subject()observer_a = ConcreteObserverA()observer_b = ConcreteObserverB()subject.add_observer(observer_a)subject.add_observer(observer_b)subject.notify_observers("Event 1")# Observer A received: Event 1# Observer B received: Event 1
Observer A received: Event 1
Observer B received: Event 1
옵저버 패턴은 객체 간의 의존성을 최소화하면서, 상태 변화를 다른 객체에게 통보할 때 매우 유용합니다.
Subject 클래스는 옵저버를 관리하는 역할을 합니다. 주관자는 옵저버를 추가하고 제거하며, 상태 변화가 있을 때 모든 옵저버에게 알리는 기능을 갖추고 있습니다.
Observer 클래스는 옵저버의 기본 인터페이스로, update 메서드를 정의합니다. 실제 옵저버 클래스는 이 메서드를 구현해야 합니다.
ConcreteObserverA와 ConcreteObserverB는 Observer 클래스를 구현한 구체적인 옵저버입니다. 각 옵저버는 update 메서드를 통해 주관자에게서 전달받은 메시지를 출력합니다.
결론
디자인 패턴을 적절히 활용하면 코드의 유지보수성과 확장성을 높일 수 있으며, 성능 및 최적화 측면에서도 큰 이점을 가져올 수 있습니다. 이 글에서 다룬 패턴들인 싱글톤 패턴, 팩토리 메서드 패턴, 전략 패턴, 옵저버 패턴은 자주 사용되는 패턴들로, 다양한 프로젝트에서 유용하게 활용될 수 있습니다.