Entwurfsmuster in C++: fortgeschrittene Techniken und Beispiele

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Fortgeschrittene Entwurfsmuster in C++: von der Theorie zu komplexen Implementierungen

\n\n

Entwurfsmuster sind bewährte Lösungen für typische Aufgaben, die bei der Softwareentwicklung auftreten. Während grundlegende Muster (Singleton, Factory, Observer) jedem Entwickler bekannt sind, erfordern fortgeschrittene Techniken ein tiefes Verständnis der Sprache C++, ihrer Templates, Mehrfachvererbung und Metaprogrammierung. In diesem Artikel analysieren wir vier leistungsstarke Muster: Visitor, Strategy, State und CRTP – mit realen Codebeispielen und Erklärungen, wann sie anzuwenden sind.

\n\n

1. Visitor-Muster (Besucher) – Erweiterung der Funktionalität ohne Klassenänderung

\n\n

Das Visitor-Muster ermöglicht das Hinzufügen neuer Operationen zu einer Klassenhierarchie, ohne die Klassen selbst zu ändern. Dies ist besonders nützlich, wenn Sie eine stabile Objektstruktur, aber häufig wechselnde Verarbeitungsalgorithmen haben.

\n\n

Beispiel: Verarbeitung geometrischer Formen

\n\n
#include <iostream>\n#include <vector>\n#include <memory>\n\n// Forward declaration\nclass Circle;\nclass Rectangle;\n\n// Abstrakter Besucher\nclass Visitor {\npublic:\n    virtual void visit(Circle& circle) = 0;\n    virtual void visit(Rectangle& rectangle) = 0;\n    virtual ~Visitor() = default;\n};\n\n// Abstraktes Element\nclass Shape {\npublic:\n    virtual void accept(Visitor& visitor) = 0;\n    virtual ~Shape() = default;\n};\n\n// Konkrete Elemente\nclass Circle : public Shape {\npublic:\n    double radius;\n    explicit Circle(double r) : radius(r) {}\n    void accept(Visitor& visitor) override {\n        visitor.visit(*this);\n    }\n};\n\nclass Rectangle : public Shape {\npublic:\n    double width, height;\n    Rectangle(double w, double h) : width(w), height(h) {}\n    void accept(Visitor& visitor) override {\n        visitor.visit(*this);\n    }\n};\n\n// Konkreter Besucher – Flächenberechnung\nclass AreaVisitor : public Visitor {\npublic:\n    double totalArea = 0.0;\n    void visit(Circle& circle) override {\n        totalArea += 3.14159 * circle.radius * circle.radius;\n    }\n    void visit(Rectangle& rectangle) override {\n        totalArea += rectangle.width * rectangle.height;\n    }\n};\n\nint main() {\n    std::vector<std::unique_ptr<Shape>> shapes;\n    shapes.push_back(std::make_unique<Circle>(5.0));\n    shapes.push_back(std::make_unique<Rectangle>(4.0, 6.0));\n\n    AreaVisitor areaCalc;\n    for (auto& shape : shapes) {\n        shape->accept(areaCalc);\n    }\n    std::cout << "Total area: " << areaCalc.totalArea << std::endl;\n    return 0;\n}\n
\n\n

Wann verwenden: wenn verschiedene Operationen auf Objekten einer komplexen Hierarchie ausgeführt werden sollen, ohne deren Code zu ändern. Nachteil: Das Hinzufügen eines neuen Typs erfordert die Änderung aller Besucher.

\n\n

2. Strategy-Muster (Strategie) – flexible Algorithmenwechsel zur Laufzeit

\n\n

Strategy kapselt eine Familie austauschbarer Algorithmen und ermöglicht deren Austausch zur Laufzeit. In C++ wird dies oft über std::function oder virtuelle Klassen implementiert.

\n\n

Beispiel: Daten-Sortiersystem

\n\n
#include <iostream>\n#include <vector>\n#include <algorithm>\n#include <memory>\n#include <functional>\n\n// Kontext, der die Strategie verwendet\nclass Sorter {\nprivate:\n    std::function<void(std::vector<int>&)> strategy_;\npublic:\n    explicit Sorter(std::function<void(std::vector<int>&)> strategy)\n        : strategy_(std::move(strategy)) {}\n\n    void setStrategy(std::function<void(std::vector<int>&)> newStrategy) {\n        strategy_ = std::move(newStrategy);\n    }\n\n    void sort(std::vector<int>& data) {\n        if (strategy_) {\n            strategy_(data);\n        }\n    }\n};\n\n// Konkrete Strategien\nvoid bubbleSort(std::vector<int>& da                

Blogs

Buchempfehlungen