2015-05-22 24 views
4

考虑下面的代码。通过A::doit()B对象应该总计增加3.一个Decorated1对象应该总计增加4个, 和一个Decorated2对象应该总数增加5.一个A对象是这些派生类型的组合仍然执行他们的“特殊行动”,但是是通过个人增加总额的最大值(而非总和)来增加总额。但装饰者模式是获得总和而不是最大值。我必须在这里放弃Decorator模式吗?Decorator模式是否适合您?

#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 + ='? – Barry

+0

@Barry。我希望在这里有一些解决方法,我得到所有的输出语句,但只提取最大值。 – prestokeys

回答

2

你需要拆分的doIt了功能。您不能在功能中应用增量做一些特殊的事情,而不是同时发生这两种操作。

有两种方法可以完成此操作。两者都要求您将增量隔离到自己的方法。

  • 使增量值成为一个多态属性,并在基类中应用增量,不要调用超类。
  • 全覆盖的增量在刚刚派生类
5

Decorator模式是一类结构模式,即结构模式可以帮助您添加和构建功能当前功能

这就是你的理由(B功能< < 3 >> + Decorated1功能< < 4 >> + Decorated2功能< < 5 >>)。

如果你想保持结构模式工作,如果你想获得预期的结果,你必须初始化和发送A类的对象均单独装饰类..

否则,你可以工作在战略设计模式,并得到了相同的结果..

还有一个很好的选择是使用创力设计模式

可以查看设计模式与在这里Java代码这些例子.. https://github.com/pavansn/java-design-patterns

希望它可以帮助

2

继承,当一个类继承另一个类的概念,通过继承创建的对象继承值,因此在结构A的

对象代码的结果具有值0
STRUCT B的对象具有值3
STRUCT Decorator1的对象具有值7(3 + 4)结构的Decorator2
对象具有值12(3 + 4 + 5)

你可以我使用其他设计模式(如创建模式)来解决您的问题。