C中有没有“devise模式”?

我知道devise模式通常是与OO编程相关的东西,但是当您编程C时,您是否有一些经常使用的模式?

我对古典OO模式的简单翻译不感兴趣,请不要提及达夫的设备。 😉

我最喜欢的是Adam Petersen的“C模式”系列:

  • 一stream的ADT
  • 战略
  • 观察
  • 反应堆

另外:我一直认为goto作为一个伟大的穷人的装饰模式的工具。

devise模式可以被视为缺less语言function。 devise模式介绍:可重用面向对象软件的元素陈述:

编程语言的select是重要的,因为它影响了一个人的观点。 我们的模式假定了Smalltalk / C ++级别的语言特性,这个select决定了什么可以轻松实现。 如果我们采用程序语言,我们可能会包含一些名为“inheritance”,“封装”和“多态性”的devise模式。 类似地,我们的一些模式直接由不太常见的面向对象的语言来支持。 例如,CLOS具有多种方法,从而减less了访问者等模式的需求。 ( 斜体我的

斜体句是你的问题的答案。

通过callback的多态性,例如标准库的qsort函数。 所有它需要的是一种比较两个元素的方法,它可以对它们进行sorting。

通过使用一组函数(vtable)来表示一个types的相关属性,以便generics例程可以有效地处理它,你可以比这更复杂。 例如,读取,写入等在打开的文件或networking端口上调用。

是的,有。 惰性初始化,单例,对象池,对象状态等都可以很容易地在纯C中实现。

示例(延迟初始化)

 #include <stdio.h> struct foo { int payload; }; int calculate_payload() { printf("%s\n", "Performing lengthy initialization..."); return 42; } struct foo *get_default_foo() { static int foo_calculated = 0; static struct foo default_foo; if (!foo_calculated) /* assuming single-threaded access */ { foo_calculated = 1; default_foo.payload = calculate_payload(); } return &default_foo; } int main() { struct foo *foo1, *foo2; printf("%s\n", "Starting the program"); foo1 = get_default_foo(); printf("%d\n", foo1->payload); foo2 = get_default_foo(); printf("%d\n", foo2->payload); return 0; } 

从我的头顶

  • 使用gotos进行error handling
  • 用结构体和函数指针实现的对象

devise模式通常对与现有环境所提供的只有一个级别的事物进行build模。 如果你把C的标准库作为环境,一个杰出的devise模式就是面向对象。

虚拟文件系统是学习devise模式的完美例子。