Erich Gamma Ralph Johnson Richard Helm John Vlissides Addison-Wesley



Download 6,32 Mb.
Pdf ko'rish
bet257/273
Sana02.03.2022
Hajmi6,32 Mb.
#479589
1   ...   253   254   255   256   257   258   259   260   ...   273
Bog'liq
Priemioop

Паттерны поведения
class EquipmentVisitor {
public:
virtual -EquipmentVisitor();
virtual void VisitFloppyDiskfFloppyDisk*);
virtual void VisitCard(Card*);
virtual void VisitChassis(Chassis*);
virtual void VisitBus(Bus*);
// и так далее для всех конкретных подклассов Equipment
protected:
EquipmentVisitor();
};
Все подклассы класса Equipment определяют функцию Accept практически
одинаково. Она вызывает операцию EquipmentVisitor, соответствующую тому
классу, который получил запрос Accept:
void FloppyDisk::Accept (EquipmentVisitor& visitor) {
visitor.VisitFloppyDisk(this);
}
Виды оборудования, которые содержат другое оборудование (в частности, под-
классы CompositeEquipment в терминологии паттерна компоновщик), реализу-
ют Accept путем обхода своих потомков и вызова Accept для каждого из них.
Затем, как обычно, вызывается операция Visit. Например, Chassis: :Accept
могла бы обойти все расположенные на шасси компоненты следующим образом:
void Chassis::Accept (EquipmentVisitor& visitor) {
for (
ListIterator i(_parts);
!i.IsDone();
i . N e x t ( )
) {
i.Currentltemf)->Accept(visitor);
}
visitor.VisitChassis(this);
}
Подклассы EquipmentVisitor определяют конкретные алгоритмы, приме-
няемые к структуре оборудования. Так, PricingVisitor вычисляет стоимость
всей конструкции, для чего суммирует нетто-цены простых компонентов (напри-
мер, гибкие диски) и цену со скидкой составных компонентов (например, рамы
и шины):
class PricingVisitor : public EquipmentVisitor {
public:
PricingVisitor();
Currency& GetTotalPriceO;
virtual void VisitFloppyDisk(FloppyDisk*);


Паттерн Visitor
virtual void VisitCard(Card*);
virtual void VisitChassis(Chassis*);
virtual void VisitBus(Bus*);
// ...
private:
Currency _total;
};
void PricingVisitor::VisitFloppyDisk (FloppyDisk* e) {
_total + = e->NetPrice();
}
void PricingVisitor::VisitChassis (Chassis* e) {
_total += e->DiscountPrice();
}
Таким образом, посетитель PricingVisitor подсчитает полную стоимость
всех узлов конструкции. Заметим, что PricingVisitor выбирает стратегию вы-
числения цены в зависимости от класса оборудования, для чего вызывает соответ-
ствующую функцию-член. Особенно важно то, что для оценки конструкции мож-
но выбрать другую стратегию, просто поменяв класс PricingVisitor.
Определить посетитель для составления инвентарной описи можно следую-
щим образом: ,
class InventoryVisitor : public EquipmentVisitor {
public:
InventoryVisitor();
InventoryS Getlnventory();
virtual void VisitFloppyDisk(FloppyDisk*);
virtual void VisitCard(Card*);
virtual void VisitChassis(Chassis*);
virtual void VisitBus(Bus*);
// ...
private:
Inventory „inventory;
};
Посетитель InventoryVisitor подсчитывает итоговое количество каждого
вида оборудования во всей конструкции. При этом используется класс Inventory,
в котором определен интерфейс для добавления компонента (здесь мы его приво-
дить не будем):
void InventoryVisitor::VisitFloppyDisk (FloppyDisk* e) {
_inventory.Accumulate(e);
}
void Invent oryVi si to"r: :VisitChassis (Chassis* e) {
_inventory.Accumulate(e);
}



Download 6,32 Mb.

Do'stlaringiz bilan baham:
1   ...   253   254   255   256   257   258   259   260   ...   273




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish