프로그래밍 공부
카테고리
작성일
2023. 11. 14. 18:58
작성자
WDmil
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