computer 와 스테레오 컴포넌트들과 같은 장치들 (Equipment) 는 보통 격납 계층의 부분-전체 식으로 구성된다. 예를 들어 섀시 (chassis) 는 드라이브들(하드디스크 드라이브, 플로피 디스크 드라이브 등) 과 평판들 (컴퓨터 케이스의 넓은 판들) 을 포함하고, 버스는 카드들을 포함할 수 있고, 캐비넷은 섀시와 버스 등등을 포함할 수 있다. 이러한 구조는 자연스럽게
CompositePattern으로 모델링될 수 있다.
Equipment 클래스는 부분-전체 계층구조의 모든 equipment들을 위한 인터페이스를 정의한다.
~cpp
class Equipment {
public:
virtual ~Equipment ();
const char* Name () { return _name; }
virtual Watt Power ();
virtual Currency NetPrice ();
virtual Currency DiscountPrice ();
virtual void Add (Equipment* );
virtual void Remove (Equipment* );
virtual Iterator<Equipment*>* CreateIterator ();
protected:
Equipment (const char*);
private:
const char* _name;
};
Equipment 는 전원소모량 (power consumption)과 가격(cost) 등과 같은 equipment의 일부의 속성들을 리턴하는 명령들을 선언한다. 서브클래스들은 해당 장비의 구체적 종류에 따라 이 명령들을 구현한다. Equipment 는 또한 Equipment의 일부를 접근할 수 있는 Iterator 를 리턴하는
CreateIterator 명령을 선언한다. 이 명령의 기본적인 구현부는 비어있는 집합에 대한
NullIterator 를 리턴한다.
Equipment 의 서브클래스는 디스크 드라이브나 IC 회로, 스위치 등을 표현하는 Leaf 클래스를 포함할 수 있다.
~cpp
class FloppyDisk : public Equipment {
public:
FloppyDisk (const char*);
virtual ~FloppyDisk ();
virtual Watt Power ();
virtual Currency NetPrice ();
virtual Currency DiscountPrice ();
};
~cpp
class CompositeEquipment : public Equipment {
public:
virtual ~CompositeEquipment ();
virtual Watt Power ();
virtual Currency NetPrice ();
virtual Currency DiscountPrice ();
virtual void Add (Equipement* );
virtual void Remove (Equipment* );
virtual Iterator<Equipment*>* CreateIterator ();
protected:
CompositeEquipment (const char*);
private:
List<Equipment*>_equipment;
};
CompositeEquipment 는 sub-equipment 에 접근하고 관리하기 위한 명령들을 정의한다. 이 명령들인 Add 와 Remove는 _equipment 멤버에 저장된 equipment 의 리스트로부터 equipment 를 추가하거나 삭제한다.
CreateIterator 명령은 이 리스트들을 탐색할 수 있는 iterator(구체적으로
ListIterator의 인스턴스) 를 리턴한다.
NetPrice 의 기본 구현부는 sub-equipment 의 net price의 합을 구하기 위해
CreateIterator를 이용할 것이다.
~cpp
Currency CompositeEquipment::NetPrice () {
Iterator<Equipment*>* i = CreateIterator ();
Currency total = 0;
for (i->first (); !i->IsDone (); i->Next ()) {
total += i->CurrentItem ()->NetPrice ();
}
delete i;
return total;
}
자, 우리는 컴퓨터 섀시를 Chassis 라 불리는
CompositeEquipment의 서브클래스로서 표현할 수 있다. Chassis는
CompositeEquipment로부터 자식-관련 명령어들을 상속받는다.
~cpp
class Chassis : public CompositeEquipment {
public:
Chassis (const char*);
virtual ~Chassis ();
virtual Watt Power ();
virtual Currency NetPrice ();
virtual Currency DiscountPrice ();
};
우리는 간단한 방법으로 Cabinet 나 Bus 와 같은 다른 equipment 컨테이너를 정의할 수 있다. 이로서 우리가 개인용 컴퓨터에 equipment들을 조립하기 위해 (꽤 간단하게) 필요로 하는 모든 것들이 주어졌다.
~cpp
Cabinet* cabinet = new Cabinet ("PC Cabinet");
Chassis* chassis = new Chassis ("PC Chassis");
cabinet->Add (chassis);
Bus* bus = new Bus ("MCA Bus");
bus->Add (new Card("16Mbs Token Ring"));
chassis->Add (bus);
chassis->Add (new FloppyDisk ("3.5in Floppy"));
cout << "The net price is " << chassis->NetPrice () << endl;