伪代码引自Erich Gamma 等《Design Patterns》.
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 Equiment{
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{
};
class Cabinet:public CompositeEquipment{
};
//...
Cabinet* cabinet = new Cabinet("PC Cabinet");
Chassis* chassis = new Chassis("PC Chassis");
cabinet->Add(chassis);
Bus* bus = new Bus("Bus");
bus->Add(new Card("16mb card"));
chassis->Add(bus);
chassis->Add(new FloppyDisk("3.5in disk"));
cout<<"The total price is "<<chassis->NetPrice()<<endl;