--来自《设计模式:可复用面向对象软件的基础》
目的
将对象组合成树形结构以表示“部分-整体”的层次结构。使得用户对单个对象和组合对象的使用具有一致性。
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;
};
Class FloppyDisk : public Equipment
{
Public:
FloppyDisk(const char*);
Virtual ~FloppyDisk ();
Virtual Watt Power();
Virtual Currency NetPrice();
Virtual Currency DiscountPrice();
};
Class CompositeEquipment : public Equipment
{
Public:
Virtual ~CompositeEquipment ();
Virtual Watt Power();
Virtual Currency NetPrice();
Virtual Currency DiscountPrice();
Virtual void Add(Equipment*);
Virtual void Remove(Equipment*);
Virtual Iterator<Equipment*>* CreateIterator();
Protected:
CompositeEquipment (const char*);
Private:
List<Equipment*> _equipment;
};
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;
};
Class Chassis : public CompositeEquipment
{
Public:
Chassis (const char*);
Virtual ~Chassis ();
Virtual Watt Power();
Virtual Currency NetPrice();
Virtual Currency DiscountPrice();
};
Cabinet* cabinet = new Cabinet();
Chassis* chassis = new 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;