Observer(관찰자) - 객체 동작 모드

4245 단어 관찰자
1. 의도
대상 간의 일대다 의존 관계를 정의합니다. 대상의 상태가 바뀌면 그 대상에 의존하는 모든 대상이 알림을 받고 자동으로 업데이트됩니다.
2. 별명
종속(Depenents), 게시 - 구독(Publish-subscribe)
3. 동기
하나의 목표는 임의의 숫자로 그것에 의존하는 관찰자가 있을 수 있다.일단 목표의 상태가 바뀌면 모든 관찰자가 통지를 받는다.이 알림의 응답으로 모든 관찰자는 목표의 동기화 상태를 위해 목표를 조회할 것이다.
4. 적용성
4
  • 하나의 추상 모델은 두 가지 측면이 있는데 그 중 하나는 다른 측면에 의존한다.이 둘을 독립된 대상에 봉하여 각각 독립적으로 바꾸고 복용할 수 있도록 하다

  • 4
  • 한 대상의 변화가 다른 대상을 동시에 바꾸어야 하는데 구체적으로 얼마나 많은 대상이 바뀌어야 하는지 모른다

  • 4
  • 한 대상이 다른 대상에게 통지해야 하고 다른 대상이 누구인지 가정할 수 없다.다시 말하면, 너는 이 대상들이 긴밀하게 결합되는 것을 원하지 않는다

  • 5. 구조
        
    6. 코드 인스턴스
    //Subject.h#include #include class AbstractObserver;class AbstractSubject
    {public:    virtual void Attach(std::shared_ptr pObserber)=0;    virtual void Notify()=0;    virtual void SetState(int state)=0;    virtual int GetState()=0;
    };class ConcreteSubject : public AbstractSubject
    {public:
        ConcreteSubject();    ~ConcreteSubject();    virtual void Attach(std::shared_ptr pObserber);    virtual void Notify();    virtual void SetState(int state);    virtual int GetState();private:
        std::vector<:shared_ptr>> m_vecObservers;    int m_state;
    };
    //Observer.h#include class AbstractSubject;class AbstractObserver
    {public:    virtual void Update()=0;
    };class ConcreteObserver1 : public AbstractObserver
    {public:
        ConcreteObserver1(std::shared_ptr pSubject);    ~ConcreteObserver1();    virtual void Update();private:
        std::shared_ptr m_Subject;
    };class ConcreteObserver2: public AbstractObserver
    {public:
        ConcreteObserver2(std::shared_ptr pSubject);    ~ConcreteObserver2();    virtual void Update();private:
        std::shared_ptr m_Subject;
    };class ConcreteObserver3 : public AbstractObserver
    {public:
        ConcreteObserver3(std::shared_ptr pSubject);    ~ConcreteObserver3();    virtual void Update();private:
        std::shared_ptr m_Subject;
    };
    //Subject.cpp#include "Subject.h"#include "Observer.h"ConcreteSubject::ConcreteSubject()
    {
    }
    
    ConcreteSubject::~ConcreteSubject()
    {
    }void ConcreteSubject::SetState(int state)
    {
        m_state = state;
    }void ConcreteSubject::Attach(std::shared_ptr pObserver)
    {
        m_vecObservers.push_back(pObserver);
    }int ConcreteSubject::GetState()
    {    return m_state;
    }void ConcreteSubject::Notify()
    {    for(auto iter = m_vecObservers.begin(); iter != m_vecObservers.end(); ++iter)
        {
            (*iter)->Update();
        }
    }
    // Observer.cpp#include "Observer.h"#include "Subject.h"#include ConcreteObserver1::ConcreteObserver1(std::shared_ptr pSubject)
        : m_Subject(pSubject)
    {
    }
    
    ConcreteObserver1::~ConcreteObserver1()
    {
    }void ConcreteObserver1::Update()
    {
        std::cout <GetState() < pSubject)
        : m_Subject(pSubject)
    {
    }
    
    ConcreteObserver2::~ConcreteObserver2()
    {
    }void ConcreteObserver2::Update()
    {
        std::cout <GetState() < pSubject)
        : m_Subject(pSubject)
    {
    }
    
    ConcreteObserver3::~ConcreteObserver3()
    {
    }void ConcreteObserver3::Update()
    {
        std::cout <GetState() < 
       
       
      
    //client.cpp#include "Observer.h"#include "Subject.h"int main()
    {
        std::shared_ptr pSubject(new ConcreteSubject);
        
        std::shared_ptr pObserver1(new ConcreteObserver1(pSubject));
        std::shared_ptr pObserver2(new ConcreteObserver2(pSubject));
        std::shared_ptr pObserver3(new ConcreteObserver3(pSubject));
    
        pSubject->Attach(pObserver1);
        pSubject->Attach(pObserver2);
        pSubject->Attach(pObserver3);
    
        pSubject->SetState(5);
    
        pSubject->Notify();    while(1);
    }

    7. 테스트 결과

    좋은 웹페이지 즐겨찾기