首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >装饰者模式在这里是合适的选择吗?

装饰者模式在这里是合适的选择吗?
EN

Stack Overflow用户
提问于 2015-05-22 23:18:22
回答 2查看 162关注 0票数 4

考虑下面的代码。通过A::doit()B对象应该将总数增加3。Decorated1对象应该将总数增加4,Decorated2对象应该将总数增加5。作为这些派生类型的组合的A对象仍将执行它们的“特殊操作”,但将使总数增加个体总增量的最大值(而不是总和)。但是装饰器模式得到的是和,而不是最大值。我必须在这里放弃装饰者模式吗?

代码语言:javascript
复制
#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;
}

输出:

代码语言:javascript
复制
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.
EN

回答 2

Stack Overflow用户

发布于 2015-05-22 23:49:38

装饰器模式是结构化模式的一类,即结构化模式可以帮助您向当前功能添加和构建功能

这就是为什么你得到的所有装饰器的总和为12 (B feature<<3>> + Decorated1 feature<<4>> + Decorated2 feature<<5>> )。

如果您想继续处理结构化模式,并且想要产生预期的结果,则必须初始化A类的对象,并将其分别发送到所有的装饰器类。

否则,您可以使用策略设计模式,并获得相同的结果。

更好的选择是使用Creational设计模式

你可以在这里用java代码查看这些关于设计模式的例子。https://github.com/pavansn/java-design-patterns

希望能有所帮助

票数 3
EN

Stack Overflow用户

发布于 2015-05-22 23:36:26

您需要拆分doIt的功能。你不能在函数中应用一个增量,做一些特殊的事情,而不让两个操作都发生。

有两种方法可以实现这一点。这两种方法都要求您将增量隔离到自己的方法中。

  • 将增量值设置为多态属性,并在基类中应用增量,而不调用超类。
  • 仅在派生类

中完全覆盖增量

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30400382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档