본문 바로가기
CS 전공지식 정리/디자인 패턴

[디자인 패턴] 옵저버 패턴(Observer Pattern)

by code_killer 2023. 10. 22.
728x90
반응형

1. 옵저버 패턴(Observer Pattern)

  • 한 객체의 상태가 변경될 때마다 그 객체에 의존하는 다른 객체들에게 알림을 보내는 디자인 패턴
#include <iostream>
#include <vector>

using namespace std;

class Observer {
public:
	virtual void update(float temperture, float humidity) = 0;
};

class WeatherStation {
private:
	vector<Observer*> observers;
	float temperture;
	float humidity;

public:
	void addObserver(Observer* observer) {
		observers.push_back(observer);
	}

	void removeObserver(Observer* observer) {
		observers.erase(remove(observers.begin(), observers.end(), observer), observers.end());
	}

	void notifyObservers() {
		for (auto& observer : observers) {
			observer->update(temperture, humidity);
		}
	}

	void setMeasurements(float temp, float humi) {
		this->temperture = temp;
		this->humidity = humi;
		notifyObservers();
	}
};

class TemperatureDisplay : public Observer {
public:
	void update(float temperature, float humidity) override {
		cout << "Temperature Display: " << temperature << "C degrees" << endl;
	}
};

class HumidityDisplay : public Observer {
public:
	void update(float temperature, float humidity) {
		cout << "Humidity Display: " << humidity << "% Humidity" << endl;
	}
};

int main() {
	WeatherStation weatherStation;

	TemperatureDisplay tempDisplay;
	weatherStation.addObserver(&tempDisplay);

	HumidityDisplay humiDisplay;
	weatherStation.addObserver(&humiDisplay);

	weatherStation.setMeasurements(25.0f, 65.0f);

	return 0;
}

 

2. 옵저버 패턴의 장점

 1. 추상화와 결합도 감소

  - 옵저버와 주제(Subject) 사이에 추상적인 바인딩이 생성되므로, 두 객체는 서로 독립적으로 변경 가능. 두 시스템 간의 결합도를 줄여주며, 유지보수와 확장성을 향상

 2. 브로드캐스트 커뮤니케이션

  - 주제가 상태 변경을 알리면, 모든 등록된 옵저버들이 자동으로 알림을 받습니다. 이는 일대다(one-to-many) 의존성 관계를 지원.

 3. 동적인 관찰

  - 실행 시간 중에 옵저버를 추가하거나 제거할 수 있으므로, 시스템의 동작을 동적으로 변경 가능

 

3. 옵저버 패턴의 단점

 1. 오버헤드

  - 주제의 상태가 자주 변경되면 많은 업데이트 알림이 발생하여 성능 문제를 일으킬 수 있습니다.

 2. 예기치 않은 업데이트

  - 복잡한 경우나 여러 주제에서 업데이트가 발생하는 경우, 옵저버는 예기치 않은 순서로 업데이트 되는 가능성 존재

 3. 메모리 누수 위험

  - 삭제되지 않고 계속 참조되는 옵저버 때문에 메모리 누수가 발생할 가능성이 존재

 

4. 옵저버 패턴의 대표적인 예

 1. MVC 패턴

  - 옵저버 패턴은 주로 이벤트 기반 시스템에 사용되며, MVC 패턴에 사용

2. Vue.js

 - 프런트엔드에서 많이 쓰는 프레임워크 Vue.js 3.0에서 ref나 reactive로 정의하면 해당 값이 변경되었을 때 자동으로 DOM에 있는 값이 변경되는데, 이는 옵저버 패턴을 이용하여 구현함.

728x90