[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
,

◈ Iteratro Pattern 정의

복합 객체 요소들의 내부 표현 방식은 공개하지 않고,

순차적인 접근 방법을 제공하는 패턴.

 

◈ Iteratro Pattern 구현 방법

객체 집단을 특정객체(iterator)에 넣고, 동일한 방법으로 객체 집단 속 객체가

다뤄질 수 있도록 만들어 준다.

 

◈ Iteratro Pattern 예제(c++)

자판기에 음료를 추가하는 시나리오.

이터레이터 패턴을 이용해, 추가된 음료수에 보다 간편하게 접근.

[소스코드 첨부]

main.cpp

 

 

 

 

 

 

 

 

 

 

 

Posted by miniature88
,

◈ Command Pattern 사전적 의미
- 명령
- 명령어

 

◈ Command Pattern 정의

서로 다른 요청을 객체화하여 클라이언트에게 파라미터로 넘겨줄 수 있도록 하는 패턴

◈ 이런 상황이 있다고 가정해보자

 

 

동물원 관장(클라이언트)이 동물원 관리를 하려고 하는데, 직원한테 흑염소, 당나귀, 코끼리 우리 청소 좀 하고 흑염소, 당나귀, 코끼리 밥좀 챙겨줘 라고 세부적인 지시를 내린다면 관장님은 매번 피곤할 것이다. 동물 종류가 늘어나면... 관장님은 쌍코피 터짐.....

동물원 관장은 내부적인! 세부적인! 내용을 알필요 없이 그저 직원에게 명령을 내리면 된다. "동물 우리 청소하고!! 밥 좀 챙겨줘!" 라고 말이다.

 

◈ Command Pattern 패턴을 사용하지 않은 경우

 

관장님(사용자)가 원하는 작업을 수행하기 위해 내부적인 부분까지 모두 알고 있어야하고, 매번 번거롭게 하나하나 명령 내려줘야하기 때문에 번거롭다!

 

◈ Command Pattern 패턴을 사용한 경우

[C++로 만들어 본 예제 소스 코드 ]

[소스코드 파일 첨부함]

main.cpp

 

관장님(사용자)을 직원을 통해 명령을 내리게 되는데, 원하는 각각의 명령을 인자값으로 명령만 해주면 되기 때문에 편리하다. 무엇보다 관장님 입장에서는 그저- 원하는 명령만 내려주면 되는 것! 즉, 내부적인 부분에 대해서 몰라도 되기 때문에 유용한 패턴이다.  

 

Posted by miniature88
,
Composite 사전적 의미 

- 합성의

- 합성물 

 

   Composite Pattern이란?

클라이언트가 사용할 개별 객체와 복합 객체를 코드상에서 따로

구분하지 않고 이들의 공통점으로 만들어진 인터페이스를 구성해,  모두 동일하게 다룰 수 있도록 한다.

 

◈ Composite Pattern 사용하지 않는 경우

 

 

사장(클라이언트 입장)이 직원 네 명에게 명령을 내리고 싶을 때,

'번거롭게' 직원 네 명에게 명령을 네 번 내려줘야하는 불편함이

발생한다. 무엇보다 직원 수가 늘어나는 경우! 사장은 일일이 명령을 내려줘야하기때문에 점점 더 불편해지는 상황이 발생한다.

 

◈ Composite Pattern 사용한 경우

 

 

과장을 한명 고용해, 사장이 과장을 통해 한 번만 명령을 내리면 과장이 알아서 직원 네명에게 명령을 전달함으로써 사장(클라이언트)은 보다 편리하게 직원들에게 명령을 내릴 수 있게 된다.

 

◈ Composite Pattern 예제 (C++)

과장이 직원들을 리스트에 담아 내부적으로 처리해, 사장이 한 번만 명령을 내려도 등록된 모든 직원들에게 명령이 전달될 수 있도록 컴포지트

패턴 예제 소스를 작성한 것 이다.

[파일 첨부 함]   example.cpp   

       #include <list>
#include <iostream>

class ReportSender
{
public:
    virtual void sendReport() = 0;
};

class 과장Composite : public ReportSender
{
public:
    void sendReport()
    {
        std::list<ReportSender*>::iterator itor;

               //과장이 내부적으로 for문을 돌려 직원들에게 명령을 내림
        for(itor = senderList.begin(); itor != senderList.end(); ++itor) 
        {
            (*itor)->sendReport();
        }
    }
    void addSenderList(ReportSender* sender)
    {
        senderList.push_back(sender);
    }

private:
   std::list<ReportSender*> senderList;  //직원들을 저장할 리스트   
};

 

//모든 직원들을 동일한 방법으로 명령을 내릴 수 있도록 ReportSender 인터페이스를 상속받아 구현!

class 직원1 : public ReportSender
{
public:
    void sendReport()
    {
        std::cout<<"직원1"<<std::endl;
    }
   
};

class 직원2 : public ReportSender
{

    void sendReport()
    {
        std::cout<<"직원2"<<std::endl;
    }

};

class 직원3 : public ReportSender
{

    void sendReport()
    {
        std::cout<<"직원3"<<std::endl;
    }

};

void main()
{
    과장Composite* compositeReportSender = new 과장Composite;

           compositeReportSender->addSenderList(new 직원3);
    compositeReportSender->addSenderList(new 직원1);
    compositeReportSender->addSenderList(new 직원2);

           compositeReportSender->sendReport();

           //등록된 모든 직원들에게 재차 명령을 내리고 싶을때

         //compositeReportSender->sendReport()를 한 번만 다시 호출하면 되니까 편하다!
}

       
   

 

 

 

 

Posted by miniature88
,