[ppt 첨부Observer.pptx

 

 

◈ Observer Pattern 정의

특정 데이터를 감시하고 있다가 변화 발생시,

시스템에 이를 알리고 연관된 객체들이 적절한 작

동일한 인터페이스를 이용하여 실행하도록 만들어주는 패턴.

 

객체1의 상태가 변하면 연관 객체 2,3,4에 사항을 알리고 자동적으로 수정!

 

 

 

이벤트 처리를 연상시킨다 !

 

◈ Observer Pattern 필요 이유

한 객체에 가해진 변경으로 다른 객체를 변경해야 하는 경우.

변경 되어져야 하는 객체수가 많은 경우! 번거로워지기 때문에.

옵저버 패턴을 이용하면 추후에 발생하는 불편함을 줄일 수 있다. 

 

 ◈ Observer Pattern 예제(C++)

 

성적 값이 변한경우, 성적값을 표시하는 표와 그래프 값이 변하게 되는데.

성적 값이 변할때마다 따로 처리해주면 번거롭지만 옵저버 패턴을 이용하면

보다 편하게 변한 성적 값에 따라 표와 그래프에 변경된 값을 반영할 수 있다.

 

[소스 코드 첨부]

main.cpp

 

#include <iostream>
#include <vector>
using namespace std;

class Observer{
public:
 virtual void Update(int 언어, int 수학, int 외국어)=0;
};

class Subject{
public:
 virtual void NotifyObserver()=0;
 virtual void AddObserver(Observer* input)=0;
};

class 성적Data : public Subject{
public:
 virtual void NotifyObserver(){
  for (unsigned int i=0; i<observerList.size();i++)
  {
   observerList[i]->Update(m_언어,m_수학,m_외국어);
  }
 }

 virtual void AddObserver(Observer* input){
  observerList.push_back(input);
 }

 void setData(int 언어, int 수학, int 외국어){
  m_언어=언어;
  m_수학=수학;
  m_외국어=외국어;
 }

private:
 vector<Observer*> observerList;

 int m_언어;
 int m_수학;
 int m_외국어;
};


class : public Observer{
public:
 virtual void Update(int 언어, int 수학, int 외국어){
  m_언어=언어;
  m_수학=수학;
  m_외국어=외국어;

  Print();
 }

private:
 void Print(){
  cout<<"언어: "<<m_언어<<endl;
  cout<<"수학: "<<m_수학<<endl;
  cout<<"외국어: "<<m_외국어<<endl;
 }

private:
 int m_언어;
 int m_수학;
 int m_외국어;
};

class 그래프 : public Observer{
public:
 virtual void Update(int 언어, int 수학, int 외국어){
  m_언어=언어;
  m_수학=수학;
  m_외국어=외국어;

  Print();
 }

private:
 void Print(){

  for (unsigned int i=0; i<m_언어;i++)
  {
   if (i==0)
   {
    cout<<"언어   ";
   }
   cout<<"□";

  }

  cout<<endl;

  for (int i=0; i<m_수학;i++)
  {
   if (i==0)
   {
    cout<<"수학   ";
   }
   cout<<"□";
  }

  cout<<endl;

  for (int i=0; i<m_외국어;i++)
  {
   if (i==0)
   {
    cout<<"외국어 ";
   }
   cout<<"□";
  }
  cout<<endl;
  
 }

private:
 int m_언어;
 int m_수학;
 int m_외국어;
};

void main(){

 성적Data* 성적=new 성적Data;
 표* 성적표=new 표;
 그래프* 성적그래프=new 그래프;
 
 cout<<"[갱신 1]"<<endl;
 성적->AddObserver(성적표);
 성적->setData(6,2,3);
 성적->NotifyObserver();

 

 cout<<"\n[갱신 2]"<<endl;
 성적->AddObserver(성적그래프);
 성적->setData(10,12,7);
 성적->NotifyObserver();
}

 

 

 

 

Posted by miniature88
,