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
,