728x90
한 객체의 상태가 변할 때, 그 객체에 의존하는 다른 객체들이 자동으로 알림을 받아.
상태에 대한 처리를 할 수 있도록. 객체간의 결합을 낮추는 방식이다.
전역변수로 함수포인터 배열을 생성해서. 관리하는 형태를 말한다.
#pragma once
class Observer : public Singleton<Observer>
{
private:
friend class Singleton;
Observer() = default;
~Observer() = default;
public:
void AddEvent(string key, Event event);
void AddParamEvent(string key, ParamEvent paramEvent);
void AddIntParamEvent(string key, IntParamEvent paramEvent);
void ExcuteEvent(string key);
void ExcuteParamEvent(string key, void* object);
void ExcuteIntParamEvent(string key, int value);
private:
unordered_map<string, vector<Event>> totalEvent;
unordered_map<string, vector<ParamEvent>> totalParamEvent;
unordered_map<string, vector<IntParamEvent>> totalIntParamEvent;
};
전역변수로 Observer를, 싱글톤 형태로 구현한 모습이다.
밑의 매개변수는 vector로 해도, 다른걸로 바꾸어도 무방하다.
각 함수포인터는. Key, Value형태로 저장되며, 해당되는 Key가 Excute로 호출되었을 시, 함수가 각각 실행되는 형태이다.
#include "Framework.h"
void Observer::AddEvent(string key, Event event)
{
totalEvent[key].push_back(event);
}
void Observer::AddParamEvent(string key, ParamEvent paramEvent)
{
totalParamEvent[key].push_back(paramEvent);
}
void Observer::AddIntParamEvent(string key, IntParamEvent paramEvent)
{
totalIntParamEvent[key].push_back(paramEvent);
}
void Observer::ExcuteEvent(string key)
{
for (Event event : totalEvent[key])
{
event();
}
}
void Observer::ExcuteParamEvent(string key, void* object)
{
for (ParamEvent paramEvent : totalParamEvent[key])
{
paramEvent(object);
}
}
void Observer::ExcuteIntParamEvent(string key, int value)
{
for (IntParamEvent paramEvent : totalIntParamEvent[key])
{
paramEvent(value);
}
}
장점
- 유연성과 확장성이 크다.
- 객체간의 결합이 감소한다.
단점
- 객체결합이 감소함으로 디버깅이 어려울 수 있다.
728x90
'디자인 패턴' 카테고리의 다른 글
싱글톤 패턴(Singleton) (0) | 2023.10.10 |
---|---|
빌더 패턴(Builder Pattern) (0) | 2023.05.10 |
추상 팩토리 패턴( Abstract Factory Pattern ) (0) | 2023.05.05 |