我希望这不是重复,对不起我不完美的英语。
我试图了解装饰模式在c ++中是如何工作的。
我在网上找到this实施,我的设计很清楚。
我无法理解的是它在技术上是如何运作的。
当我创建一个新对象并进行装饰时,例如:
AbstractNPC *goblin1= new Elite(new Shaman(new NPC("Goblin")));
精灵1的类型将是精英,萨满,NPC还是什么?
函数render()"如何"其他类的实现并一起使用它们?
我希望当我调用render()时,我会使用此指令以递归方式调用其他装饰器类中的函数:
NPCDecorator::render();
这对我来说仍然没有意义。
这是如何以及为何有效?
答案 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"
}
}
}
}
}