Mein Favorit ist die "Patterns in C" -Serie von Adam Tornhill :
Außerdem: Ich denke immer an goto
ein großes Werkzeug für arme Leute für das Dekorationsmuster.
Update : Ich würde dringend empfehlen, Rust ( rust-lang.org ) anstelle von C zu verwenden, es sei denn, Sie müssen c verwenden. Rust bietet alle Vorteile von c, einschließlich Geschwindigkeit und Kompatibilität der Binärbibliothek mit c. Der Compiler übernimmt jedoch einen Großteil der Komplexität, um sicherzustellen, dass der Code speichersicher ist und keine Datenrassen enthält. Es ist auch portabel, verfügt über eine Standardbibliothek für allgemeine Aufgaben und ist für verschiedene Entwurfsmuster viel einfacher zu programmieren.
goto
mit Dekorateuren zu tun hat?Entwurfsmuster können als fehlende Sprachfunktionen angesehen werden. Die Einführung von Entwurfsmustern: Elemente wiederverwendbarer objektorientierter Software besagt:
Der kursive Satz ist die Antwort auf Ihre Frage.
quelle
Polymorphismus über Rückrufe, zB die
qsort
Funktion der Standardbibliothek . Alles, was es braucht, ist eine Möglichkeit, zwei Elemente zu vergleichen, und es kann ein Array von ihnen sortieren.Sie können viel ausgefeilter sein, indem Sie Funktionssätze (vtables) verwenden, um die relevanten Eigenschaften eines Typs darzustellen, damit eine generische Routine ihn sinnvoll verarbeiten kann. Beispielsweise ruft das Lesen, Schreiben usw. eine geöffnete Datei oder einen Netzwerkport auf.
quelle
Ja, das gibt es. Lazy Initialisierung, Singleton, Objektpool, Objektstatus usw. lassen sich leicht in reinem C implementieren.
Beispiel (verzögerte Initialisierung)
#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; }
quelle
Von oben auf meinem Kopf
quelle
Entwurfsmuster modellieren häufig Dinge, die nur eine Ebene von dem entfernt sind, was eine vorhandene Umgebung bietet. Wenn Sie C mit seiner Standardbibliothek als Umgebung verwenden, ist die Objektorientierung ein herausragendes Entwurfsmuster.
quelle
Das virtuelle Dateisystem ist ein perfektes Beispiel für das Erlernen des Entwurfsmusters.
quelle