[ppt 첨부] Observer.pptx
◈ Observer Pattern 정의
특정 데이터를 감시하고 있다가 변화 발생시,
시스템에 이를 알리고 연관된 객체들이 적절한 작업을
동일한 인터페이스를 이용하여 실행하도록 만들어주는 패턴.
객체1의 상태가 변하면 연관 객체 2,3,4에 사항을 알리고 자동적으로 수정!
이벤트 처리를 연상시킨다 !
◈ Observer Pattern 필요 이유
한 객체에 가해진 변경으로 다른 객체를 변경해야 하는 경우.
변경 되어져야 하는 객체수가 많은 경우! 번거로워지기 때문에.
옵저버 패턴을 이용하면 추후에 발생하는 불편함을 줄일 수 있다.
◈ Observer Pattern 예제(C++)
성적 값이 변한경우, 성적값을 표시하는 표와 그래프 값이 변하게 되는데.
성적 값이 변할때마다 따로 처리해주면 번거롭지만 옵저버 패턴을 이용하면
보다 편하게 변한 성적 값에 따라 표와 그래프에 변경된 값을 반영할 수 있다.
[소스 코드 첨부]
#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();
}
'디자인패턴' 카테고리의 다른 글
인터페이스 및 인터페이스와 추상 클래스 비교, C++ (0) | 2012.11.28 |
---|---|
가상 함수 & 추상 클래스, C++ (2) | 2012.11.21 |
Iterator Pattern, 이터레이터 패턴, C++ (1) | 2012.06.23 |
Command Pattern, 커맨드 패턴, C++ (2) | 2012.06.01 |
Composite Pattern, 컴포지트 패턴, C++ (0) | 2012.05.13 |