装饰器模式在 c++ 中的工作原理
How Decorator pattern works in c++
我希望这不是重复的,很抱歉我的英语不完美。
我试图了解装饰器模式在 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"
}
}
}
}
}
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 为什么stream::忽略未按预期工作