Decorator模式如何在c ++中工作

时间:2018-05-22 13:50:06

标签: c++ decorator

我希望这不是重复,对不起我不完美的英语。

我试图了解装饰模式在c ++中是如何工作的。

我在网上找到this实施,我的设计很清楚。

我无法理解的是它在技术上是如何运作的。

当我创建一个新对象并进行装饰时,例如:

AbstractNPC *goblin1= new Elite(new Shaman(new NPC("Goblin")));

精灵1的类型将是精英,萨满,NPC还是什么?

函数render()"如何"其他类的实现并一起使用它们?

我希望当我调用render()时,我会使用此指令以递归方式调用其他装饰器类中的函数:

NPCDecorator::render();

这对我来说仍然没有意义。

这是如何以及为何有效?

1 个答案:

答案 0 :(得分:1)

goblin1相关类型就在声明AbstractNPC *中。

NPCDecorator 通过保持该抽象类的另一个实例来实现这个抽象类。在表达式new Elite(new Shaman(new NPC("Goblin")))中,有三个 AbstractNPC个实例,两个装饰器和一个“普通”实例。

当虚拟调用render进入第一个装饰器时,它会执行它的内容,然后调用它的基类render,它只委托给装饰的npc成员。

您将拥有一个调用堆栈,如:

Elite::render
{
    // this == Elite * @ 0x12345678
    cout << "Elite ";
    NPCDecorator::render
    {
        Shaman::render
        {
            // this == Shaman * @ 0x56781234
            cout << "Shaman ";
            NPCDecorator::render
            {
                NPC::render
                {
                    // this == NPC * @ 0x78563412
                    cout << name; // "Goblin"
                }
            }
        }
    }
}