C++ में उन्नत डिज़ाइन पैटर्न: सिद्धांत से वास्तविक कोड तक
डिज़ाइन पैटर्न ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में सामान्य समस्याओं के सिद्ध समाधान हैं। यदि आपने पहले से ही बुनियादी पैटर्न (Singleton, Factory, Observer) में महारत हासिल कर ली है, तो अगले स्तर पर जाने का समय आ गया है। इस लेख में, हम चार उन्नत पैटर्न का विश्लेषण करेंगे: Visitor, Strategy, State और Command। सभी उदाहरण स्मार्ट पॉइंटर्स, पॉलीमॉर्फिज़्म और टेम्पलेट्स का उपयोग करके आधुनिक C++17/20 में लिखे गए हैं।
1. Visitor पैटर्न (आगंतुक)
Visitor पैटर्न कक्षाओं के पदानुक्रम में स्वयं कक्षाओं को बदले बिना नए ऑपरेशन जोड़ने की अनुमति देता है। यह AST ट्री, ग्राफिकल सीन या एक्सपोर्ट सिस्टम के साथ काम करने के लिए एक आदर्श समाधान है।
समस्या
आपके पास ज्यामितीय आकृतियों (Circle, Rectangle, Triangle) का एक पदानुक्रम है। ऑपरेशन लागू करने की आवश्यकता है: क्षेत्रफल की गणना, ड्राइंग, JSON में सीरियलाइज़ेशन। यदि प्रत्येक वर्ग में विधियाँ जोड़ी जाती हैं, तो ओपन/क्लोज्ड सिद्धांत का उल्लंघन होता है।
C++17 में समाधान
#include <iostream>#include <memory>#include <vector>
// फॉरवर्ड डिक्लेरेशनclass Circle;class Rectangle;
class Visitor {public: virtual void visit(Circle& c) = 0; virtual void visit(Rectangle& r) = 0; virtual ~Visitor() = default;};
class Shape {public: virtual void accept(Visitor& v) = 0; virtual ~Shape() = default;};
class Circle : public Shape {public: double radius = 5.0; void accept(Visitor& v) override { v.visit(*this); }};
class Rectangle : public Shape {public: double width = 4.0, height = 6.0; void accept(Visitor& v) override { v.visit(*this); }};
// ठोस आगंतुकclass AreaVisitor : public Visitor {public: void visit(Circle& c) override { std::cout << "Circle area: " << 3.14159 * c.radius * c.radius << ""; } void visit(Rectangle& r) override { std::cout << "Rectangle area: " << r.width * r.height << ""; }};
int main() { std::vector<std::unique_ptr<Shape>> shapes; shapes.push_back(std::make_unique<Circle>()); shapes.push_back(std::make_unique<Rectangle>());
AreaVisitor av; for (auto& s : shapes) { s->accept(av); } return 0;}2. Strategy पैटर्न (रणनीति)
Strategy रनटाइम के दौरान डेटा प्रोसेसिंग एल्गोरिदम को बदलने की अनुमति देता है। Visitor के विपरीत, जो ऑब्जेक्ट पदानुक्रम के साथ काम करता है, Strategy एक अलग एल्गोरिदम को एनकैप्सुलेट करता है।
वास्तविक परिदृश्य
फ़ाइल संपीड़न प्रणाली। उपयोगकर्ता एल्गोरिदम चुनता है: ZIP, GZIP या कस्टम। if-else श्रृंखला के बजाय Strategy का उपयोग करें।
std::function के साथ कार्यान्वयन
#include <iostream>#include <functional>#include <string>
class CompressionContext {private: std::function<void(const std::string&)> strategy_;public: explicit CompressionContext(std::function<void(const std::string&)> strategy) : strategy_(std::move(strategy)) {}
void setStrategy(std::function<void(const std::string&)> strategy) { strategy_ = std::move(strategy); }
void compress(const std::string& data) { if (strategy_) { strategy_(data); } else { std::cout << "No strategy set"; } }};
int main() { auto zip = [](const std::string& d) { std::cout << "Compressing with ZIP: " << d << ""; }; auto gzip = [](const std::string& d) { std::cout << "Compressing with GZIP: " << d << ""; };
CompressionContext ctx(zip); ctx.compress("Hello World"); // ZIP
ctx.setStrategy(gzip)