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
'CS 전공지식 정리 > 디자인 패턴' 카테고리의 다른 글
[디자인 패턴] 전략 패턴(Strategy Pattern) (1) | 2023.10.22 |
---|---|
[디자인 패턴] 팩토리 패턴(Factory Pattern) (0) | 2023.10.22 |
[디자인 패턴] 싱글톤 패턴(Singleton Pattern) (0) | 2023.06.23 |