You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Паттерн Composite<br />
class FloppyDisk : public Equipment {<br />
public:<br />
FloppyDisk(const char*);<br />
virtual -FloppyDisk();<br />
virtual Watt Power();<br />
virtual Currency NetPriceO;<br />
virtual Currency DiscountPrice();<br />
};<br />
CompositeEquipment - это базовый класс для оборудования, содержащего<br />
другое оборудование. Одновременно это подкласс класса Equipment:<br />
class CompositeEquipment : public Equipment {<br />
public:<br />
virtual -CompositeEquipment();<br />
virtual Watt Power();<br />
virtual Currency NetPriceO;<br />
virtual Currency DiscountPrice();<br />
virtual void Add(Equipment*);<br />
virtual void Remove(Equipment*);<br />
virtual Iterator* Createlterator();<br />
protected:<br />
CompositeEquipment(const char*);<br />
private:<br />
List „equipment;<br />
};<br />
CompositeEquipment определяет операции для доступа и управления внутренними<br />
аппаратными блоками. Операции Add и Remove добавляют и удаляют оборудование<br />
из списка, хранящегося в переменной-члене _equipment. Операция<br />
Createlterator возвращает итератор (точнее, экземпляр класса List Iterator),<br />
который будет обходить этот список.<br />
Подразумеваемая реализация операции Net Price могла бы использовать<br />
Createlterator для суммирования цен на отдельные блоки: 1<br />
Currency CompositeEquipment::NetPrice () {<br />
Iterator* i = Createlterator();<br />
Currency total = 0;<br />
}<br />
for (i->First(); !i->IsDone(); i->Next()) {<br />
total += i->CurrentItem()->NetPrice();<br />
}<br />
delete i;<br />
return total;<br />
1<br />
Очень легко забыть об удалении итератора после завершения работы с ним. При обсуждении паттерна<br />
итератор рассказано, как защититься от таких ошибок.