2015-05-22 71 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)

你可以我使用其他設計模式(如創建模式)來解決您的問題。