装饰器模式在 c++ 中的工作原理

How Decorator pattern works in c++

本文关键字:工作 c++ 模式      更新时间:2023-10-16

我希望这不是重复的,很抱歉我的英语不完美。

我试图了解装饰器模式在 c++ 中的工作原理。

我正在使用网上找到的这个实现,设计对我来说很清楚。

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

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

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

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

以及函数 render(( 如何"获取"其他类的实现并将它们一起使用?

我希望当我调用 render(( 时,我使用以下指令递归调用其他装饰器类的函数:

NPCDecorator::render();

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

这是如何以及为什么工作的?

相关类型的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"
}
}
}
}
}