09.04.2016 Views

Priemioop

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 />

итератор рассказано, как защититься от таких ошибок.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!