- 합성의
- 합성물
클라이언트가 사용할 개별 객체와 복합 객체를 코드상에서 따로
구분하지 않고 이들의 공통점으로 만들어진 인터페이스를 구성해, 모두 동일하게 다룰 수 있도록 한다.
◈ 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()를 한 번만 다시 호출하면 되니까 편하다!
}
'디자인패턴' 카테고리의 다른 글
인터페이스 및 인터페이스와 추상 클래스 비교, C++ (0) | 2012.11.28 |
---|---|
가상 함수 & 추상 클래스, C++ (2) | 2012.11.21 |
Observer Pattern, 옵저버 패턴, C++ (0) | 2012.06.23 |
Iterator Pattern, 이터레이터 패턴, C++ (1) | 2012.06.23 |
Command Pattern, 커맨드 패턴, C++ (2) | 2012.06.01 |