我知道设计模式通常与OO编程有关,但是你有编程C时经常使用的模式吗?
我对经典OO模式的简单翻译不感兴趣,请不要提及Duff的设备。 ; - )
答案 0 :(得分:70)
我最喜欢的是Adam Petersen中的“C模式”系列:
另外:我总是认为goto
是一个伟大的穷人的装饰模式工具。
更新:我强烈建议您使用 Rust (rust-lang.org)而不是C,除非您需要使用c。 Rust具有c的所有好处,包括速度和二进制库与c的兼容性,但编译器处理大部分复杂性以确保代码是内存安全且不包含数据争用。它还具有可移植性,具有用于常见任务的标准库,并且更易于针对各种设计模式进行编程。
答案 1 :(得分:9)
设计模式可被视为缺少语言功能。 Design Patterns: Elements of Reusable Object-Oriented Software州的介绍:
编程语言的选择是 很重要,因为它会影响一个人 观点看法。我们的模式假设 Smalltalk / C ++级语言功能, 那个选择决定了什么可以 而且不能轻易实施。 如果 我们假设程序语言,我们 可能包含设计模式 称为“继承”,“封装” 和“多态性”。同样,有些 我们的模式直接受到支持 不太常见的面向对象 语言。 CLOS有多种方法,用于 例如,减少了对a的需求 访客等模式。 ( italics mine )
斜体句是你问题的答案。
答案 2 :(得分:5)
是的,有。惰性初始化,单例,对象池,对象状态等很容易在纯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;
}
答案 3 :(得分:5)
通过回调进行多态性,例如:标准库的qsort
函数。它需要的只是一种比较两个元素的方法,它可以对它们的数组进行排序。
通过使用函数集(vtable)来表示类型的相关属性,使得通用例程可以有效地处理它,您可以比这更复杂。例如,读取,写入等调用打开的文件或网络端口。
答案 4 :(得分:3)
答案 5 :(得分:1)
设计模式通常会模拟与现有环境提供的内容相同的内容。如果您将C标准库作为环境,那么一个杰出的设计模式就是面向对象。
答案 6 :(得分:1)
虚拟文件系统是学习设计模式的完美范例。