C++디자인 모드 의 관찰자 모드(Observer)

관찰자 모델 의 일반적인 명칭 은 구독-발표 모델 이 라 고 하 는데 신문 잡지 의 구독 과 유사 하 다.관찰자 와 피 관찰 자 는 바로 독자 와 우체국 의 관계 이다.독 자 는 먼저 우체국 에서 원 하 는 신문 을 구독 해 야 한다.신문 이 발행 되면 우체국 은 신문 을 독자 의 집에 우송 한다.관찰자(Observer)와 피 관찰자(Listener)도 이러한 관계 이다.Observer 는 Listener 에 자신 을 첨부 하고 Listener 가 트리거 할 때 Notify 모든 Observer.
역할.
관찰자 모드 에서 피 관찰자 가 관찰자 대상 의 집합 을 유지 하고 피 관찰자 대상 이 변화 할 때 관찰자 에 게 알려 준다.관찰자 모델 은 주로 대상 간 의 한 쌍 이상 의 관 계 를 해결 하 는 데 쓰 인 다.
클래스 보기

이루어지다

class Observer 
{
public:
  virtual ~Observer() {};
  virtual void Update(const std::string &msg)= 0; 
protected:
  Observer(){};
};


class Listener
{
public:
  virtual ~Listener() {};
  void attach(Observer* obsvr) 
  {
    m_observers.push_back(obsvr);
  }
  void remove(Observer* obsvr)
  {
    m_observers.remove(obsvr);
  }
  void notify(const std::string &msg)
  {
    list<Observer*>::iterator iter = m_observers.begin(); 
    for(; iter != m_observers.end(); iter++) 
      (*iter)->Update(msg); 
  }
private: 
  list<Observer* > m_observers; //      
};


class logRunner : public Listener
{
public:
  virtual ~logRunner(){};
  void addmsg(const std::string &msg)
  {
    nofity(msg);
  }
}

class logGui : public Observer
{
public:
  virtual ~Observer(){};
  void Update(const std::string &msg)
  {
    cout<< "Gui log show : "<< msg <<endl;
  }
}

class logFile : public Observer
{
public:
  virtual ~Observer(){};
  void Update(const std::string &msg)
  {
    cout<< "file log write : "<< msg <<endl;
  }
}

class logDebug : public Observer
{
public:
  virtual ~Observer(){};
  void Update(const std::string &msg)
  {
    cout<< "Debug log out : "<< msg <<endl;
  }
}


class logDataBase : public Observer
{
public:
  virtual ~Observer(){};
  void Update(const std::string &msg)
  {
    cout<< "DataBase log in : "<< msg <<endl;
  }
}

int main()
{
  logRunner Runner;
  logGui gGui;
  logFile gFile;
  logDebug gDebug;
  logDataBase gDataBase;
  
  Runner.attach(&gGui);
  Runner.attach(&gFile);
  Runner.attach(&gDebug);
  Runner.attach(&gDataBase);
  
  Runner.addmsg("app is setup");
}

Observer 에서 update 는 보통 순 허 이 고 하위 클래스 를 통 해 각각 이 루어 집 니 다.여 기 는 호출 된 인터페이스 가 일치 하도록 보장 할 뿐 Listener 의 attach,remove,notify 는 일반적으로 허 화 를 하지 않 는 것 을 권장 합 니 다.하위 클래스 는 내부 의 취 합 내용 에 관심 을 가지 지 않 고 notify 를 호출 하여 메 시 지 를 전달 하면 됩 니 다.물론 이 일련의 조작 을 하위 클래스 에 넣 어 실현 할 수도 있다.
호출 자 는 다 중 스 레 드 환경 에서 의 사용 환경 에 주의 하여 데이터 동기 화 작업 을 잘 해 야 한다.
응용 장면
4.567917.한 대상 이 바 뀌 면 다른 대상 에 게 통지 해 야 하고 우리 가 얼마나 많은 대상 이 통지 해 야 하 는 지 확실 하지 않 을 때
  • 한 대상 이 다른 대상 에 게 알려 야 하고 대상 이 무엇 을 실현 하 는 지 알 필요 가 없 을 때
  • 4.567917.한 무더기 의 대상 에 대해 같은 상태 나 같은 데 이 터 를 포함 하고 같은 조건 을 통 해 업 데 이 트 를 할 때이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기