Рассмотрите приведенный ниже код. Посредством A::doit()
, объект B
должен увеличить общий объем на 3. Предполагается, что объект Decorated1
увеличится на 4, и объект Decorated2
должен увеличиться на 5. Объект A
, являющийся комбинацией этих производных типов, должен все еще выполняют свои «специальные действия», но это значит, что они увеличивают общее количество на максимальную (не сумму) индивидуального прироста в целом. Но шаблон декоратора получает сумму вместо max. Должен ли я оставить шаблон декоратора здесь?Является ли шаблон декоратора подходящим выбором здесь?
#include <iostream>
int total = 0;
struct A {
public:
virtual void doIt() = 0;
};
struct Decorator : public A {
A* a;
Decorator (A* a_) : a(a_) {}
virtual void doIt() override {a->doIt();}
};
struct B : public A {
virtual void doIt() override {
total += 3;
std::cout << "Special actions by B carried out.\n";
}
};
struct Decorated1 : public Decorator {
using Decorator::Decorator;
virtual void doIt() override {
Decorator::doIt();
total += 4;
std::cout << "Special actions by Decorated1 carried out.\n";
}
};
struct Decorated2 : public Decorator {
using Decorator::Decorator;
virtual void doIt() override {
Decorator::doIt();
total += 5;
std::cout << "Special actions by Decorated2 carried out.\n";
}
};
int main() {
A* decorated1_2 = new Decorated2(new Decorated1(new B));
decorated1_2->doIt();
std::cout << "total = " << total << std::endl;
}
Выход:
Special actions by B carried out. // Good I want this.
Special actions by Decorated1 carried out. // Good I want this.
Special actions by Decorated2 carried out. // Good I want this.
total = 12 // No, it is supposed to be 5, not the sum 3+4+5.
'Decorator' не должен наследовать от' A', иначе это не декоратор ... – Barry
Кроме того, как вы хотите, чтобы все выходные команды выполнялись, но не все «total + =' ones? – Barry
@ Barry. Я надеялся, что здесь есть какое-то решение, где я получаю все выходные операторы, но извлекаю только max. – prestokeys