2015-05-22 3 views
4

Рассмотрите приведенный ниже код. Посредством 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. 
+1

'Decorator' не должен наследовать от' A', иначе это не декоратор ... – Barry

+0

Кроме того, как вы хотите, чтобы все выходные команды выполнялись, но не все «total + =' ones? – Barry

+0

@ Barry. Я надеялся, что здесь есть какое-то решение, где я получаю все выходные операторы, но извлекаю только max. – prestokeys

ответ

2

Вам нужно разделить функциональность doIt вверх. Вы не можете применять приращение в функциях и делать что-то особенное и не выполнять обе операции.

Существует два способа добиться этого. Оба требуют от вас изолировать приращение к собственному методу.

  • Сделайте значение приращения полиморфным и примените инкремент в базовом классе и не вызывайте суперкласс.
  • Полностью отменить приращение только производных классов
5

декоратор класс структурного узора, то есть структурные модели поможет вам добавлять и создавать функциональные возможности для текущих функций

Вот почему вы получив сумму всех декораторов как 12 (функция B < < 3 >> + Декорированная1 особенность < < 4 >> + Decorated2 feature < < 5 >>).

Если вы хотите продолжать работать на структурном шаблоне, и если вы хотите, чтобы получить ожидаемые результаты, вы должны инициализировать и отправить объект класса А для всех классов декоратора отдельно ..

Else, вы можете работать по стратегии Design Pattern и получить тот же результат ..

еще один хороший вариант будет использовать созидательные шаблоны проектирования

Вы можете проверить эти примеры о дизайне моделях с Java кодом над здесь .. https://github.com/pavansn/java-design-patterns

Надеется, что это помогает

2

Как понятие наследования, когда класс наследует другой класс, созданные объекты, используя наследование наследуют значения, следовательно, ваши результаты кода в

объекта Struct А имеют значение 0
Объект Struct B имеет значение 3
Объект Struct Decorator1 имеет значение 7 (3 + 4)
Объект Struct Decorator2 имеет значение 12 (3 + 4 + 5)

можно я выполните свою задачу, используя другие шаблоны проектирования, такие как шаблон создания.

Смежные вопросы