“container_of”模式的真实名称

时间:2012-02-16 22:44:49

标签: c design-patterns containers

E.g。在Linux驱动程序开发中,可以找到container_of宏。本质上它是->的反向运算符,如果你有一个指向成员的指针,则会产生指向包含结构的指针。

除了Greg Kroah的博客,我在Pintos的listhash实现中找到了这种模式。

2 个答案:

答案 0 :(得分:2)

此模式的真实名称是“container_of()”。试图将这种C-ism融入Java或C ++设计模式分类中是徒劳的。关键不在于责任,也不是指定或委托任何东西。如果你必须用这些术语思考那么它就是一个“混乱的广义继承”。如果你不必用这些术语来思考,那就不那么麻烦了。

答案 1 :(得分:0)

我会说这是一个非常特色Chain Of Responsibility。您需要指向父容器结构的指针的唯一原因是将父容器功能置于所包含元素的可及范围内。因此,可能被视为允许请求涓涓细流“链”所需的实现细节,直到它以正确的“级别”处理。

对于容器/包含关系,“正确”级别只是一个级别,并且涓流不会通过足够的级别(因为只有一个级别)产生很大的兴趣作为一个理想的例子图案。尽管如此,Chain of Responsibility背后的一般思想仍然存在;请求是在链中的一个无法处理它的点上进行的,并且在更改的不同点处理。

通过一个小的非通用容器/包含关系,这两个链接链的耦合可能变得非常紧张。例如,您的示例缺少通用的“命令”处理框架(因为命令语言集很小),并且这样的框架通常需要(对于类型安全)命令/消息对象。这是一个很大的开销,对于一个只想让它的元素直接在元素级别通知他们想要从列表中删除的列表。

是的,there is a C2 pattern's page for it ......如果你同意我的推理。