SW공학/디자인패턴
[SW공학 | 디자인패턴] 10. 옵저버 패턴 (Observer Pattern)
revolutionarylife
2024. 11. 11. 13:16
반응형
🔔 [SW공학 | 디자인패턴] 10. 옵저버 패턴 (Observer Pattern)
목차
- 옵저버 패턴 개요
- 옵저버 패턴의 필요성
- 옵저버 패턴의 구조
- 옵저버 패턴 예제
- 옵저버 패턴의 장점과 단점
- 마무리
옵저버 패턴 개요
안녕하세요! 오늘은 상태 변화가 발생할 때 자동으로 관련된 객체들에 알림을 보내는 옵저버 패턴(Observer Pattern)에 대해 알아보겠습니다. 옵저버 패턴은 행동 패턴(Behavioral Pattern) 중 하나로, 객체의 상태 변화를 감시하고 자동으로 통지하는 구조를 제공합니다.
옵저버 패턴을 사용하면, 상태 변화에 따른 자동화된 알림을 통해 객체 간 결합도를 낮추고 유연성을 높일 수 있습니다.
옵저버 패턴의 필요성
한 객체의 상태가 변화할 때, 이 변화를 여러 다른 객체에게 알려야 하는 경우가 종종 발생합니다. 예를 들어, 주식 가격이나 날씨 상태 변화와 같이 다수의 객체가 상태 변화를 실시간으로 감시해야 하는 경우에 적합합니다.
옵저버 패턴을 사용하면, 상태 변화가 발생할 때마다 자동으로 여러 구독자에게 알림을 전달할 수 있으며, 객체 간 결합도를 낮춰 유연하게 확장할 수 있습니다.
옵저버 패턴의 구조
옵저버 패턴은 Subject (관찰 대상), Observer (옵저버 인터페이스), ConcreteObserver (구체적인 옵저버)로 구성됩니다.
- Subject (관찰 대상)
- 관찰 대상의 상태가 변경되면 옵저버들에게 알림을 보내는 역할을 합니다.
- 옵저버를 등록하거나 제거할 수 있는 메서드를 제공합니다.
- Observer (옵저버 인터페이스)
- Subject가 상태 변화를 알릴 때 호출될 메서드를 정의합니다.
- ConcreteObserver (구체적인 옵저버)
- Observer 인터페이스를 구현하여, 상태 변화에 대한 알림을 수신하고 이를 처리하는 역할을 합니다.
옵저버 패턴 예제
아래 예제는 주식 가격의 변화를 감지하여 알림을 전송하는 옵저버 패턴입니다.
// Observer 인터페이스
interface Observer {
void update(String stockPrice);
}
// ConcreteObserver: 주식 변동을 알리는 텍스트 알림
class TextAlert implements Observer {
@Override
public void update(String stockPrice) {
System.out.println("텍스트 알림: 주식 가격이 " + stockPrice + "로 변경되었습니다.");
}
}
// ConcreteObserver: 주식 변동을 알리는 이메일 알림
class EmailAlert implements Observer {
@Override
public void update(String stockPrice) {
System.out.println("이메일 알림: 주식 가격이 " + stockPrice + "로 변경되었습니다.");
}
}
// Subject 인터페이스
interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
// ConcreteSubject: 주식 가격을 관리하는 Stock 클래스
class Stock implements Subject {
private List<Observer> observers = new ArrayList<>();
private String stockPrice;
public void setStockPrice(String stockPrice) {
this.stockPrice = stockPrice;
notifyObservers();
}
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(stockPrice);
}
}
}
// 클라이언트 코드
public class ObserverPatternExample {
public static void main(String[] args) {
Stock stock = new Stock();
Observer textAlert = new TextAlert();
Observer emailAlert = new EmailAlert();
stock.registerObserver(textAlert);
stock.registerObserver(emailAlert);
// 주식 가격 변경
stock.setStockPrice("1200원");
stock.setStockPrice("1300원");
}
}
출력 결과
텍스트 알림: 주식 가격이 1200원로 변경되었습니다.
이메일 알림: 주식 가격이 1200원로 변경되었습니다.
텍스트 알림: 주식 가격이 1300원로 변경되었습니다.
이메일 알림: 주식 가격이 1300원로 변경되었습니다.
예제 설명
- Observer 인터페이스: 알림을 받을 메서드인 update()를 정의합니다.
- TextAlert와 EmailAlert (ConcreteObserver): update() 메서드를 구현하여 텍스트와 이메일 방식으로 알림을 표시합니다.
- Stock 클래스 (ConcreteSubject): 옵저버들을 관리하고 주식 가격이 변경될 때 notifyObservers() 메서드를 통해 알림을 전달합니다.
옵저버 패턴의 장점과 단점
장점
- 결합도 감소: Subject와 Observer 간의 결합도를 낮춰 객체 간의 독립성을 유지할 수 있습니다.
- 유연한 확장성: 새로운 Observer를 추가해도 Subject의 코드 수정 없이 연동할 수 있습니다.
- 자동화된 알림: Subject의 상태가 변경될 때마다 자동으로 Observer들에게 알림을 보낼 수 있습니다.
단점
- 성능 문제: 옵저버가 많을 경우, 상태 변화 시 모든 옵저버에게 알림을 보내는 과정에서 성능 저하가 발생할 수 있습니다.
- 의존성 문제: Subject와 Observer 간의 의존 관계가 복잡해질 수 있으며, 알림 순서를 제어하기 어려울 수 있습니다.
마무리
옵저버 패턴은 객체의 상태 변화에 따라 다른 객체들에게 자동으로 알림을 보낼 수 있는 구조를 제공합니다. 결합도를 낮추고 유연성을 높이는 데 유용하며, 실시간 데이터 변화가 필요한 시스템에 적합합니다. 옵저버 패턴을 활용하여 효율적이고 유연한 설계를 구현해보세요! 🔔
반응형