{"id":1961,"date":"2024-06-22T09:39:09","date_gmt":"2024-06-22T09:39:09","guid":{"rendered":"https:\/\/www.w3computing.com\/articles\/?p=1961"},"modified":"2024-06-22T23:32:54","modified_gmt":"2024-06-22T23:32:54","slug":"how-to-implement-design-patterns-in-cpp","status":"publish","type":"post","link":"https:\/\/www.w3computing.com\/articles\/how-to-implement-design-patterns-in-cpp\/","title":{"rendered":"How to Implement Design Patterns in C++"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Design patterns are typical solutions to commonly occurring problems in software design. They represent best practices used by experienced object-oriented software developers. Design patterns are like pre-defined blueprints that can be customized to solve recurring design problems in various contexts. In this tutorial, we will explore several fundamental design patterns and implement them in C++.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We will cover the following design patterns:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Creational Patterns\n<ul class=\"wp-block-list\">\n<li>Singleton<\/li>\n\n\n\n<li>Factory Method<\/li>\n\n\n\n<li>Abstract Factory<\/li>\n\n\n\n<li>Builder<\/li>\n\n\n\n<li>Prototype<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Structural Patterns\n<ul class=\"wp-block-list\">\n<li>Adapter<\/li>\n\n\n\n<li>Composite<\/li>\n\n\n\n<li>Proxy<\/li>\n\n\n\n<li>Flyweight<\/li>\n\n\n\n<li>Facade<\/li>\n\n\n\n<li>Bridge<\/li>\n\n\n\n<li>Decorator<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Behavioral Patterns\n<ul class=\"wp-block-list\">\n<li>Strategy<\/li>\n\n\n\n<li>Observer<\/li>\n\n\n\n<li>Command<\/li>\n\n\n\n<li>Chain of Responsibility<\/li>\n\n\n\n<li>State<\/li>\n\n\n\n<li>Template Method<\/li>\n\n\n\n<li>Iterator<\/li>\n\n\n\n<li>Mediator<\/li>\n\n\n\n<li>Memento<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">By the end of this tutorial, you will have a comprehensive understanding of these design patterns and how to implement them in C++.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Creational Patterns<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Singleton<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Singleton pattern ensures that a class has only one instance and provides a global point of access to it. This is useful when exactly one object is needed to coordinate actions across the system.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Implementation:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;mutex&gt;<\/span><\/span>\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Singleton<\/span> {<\/span>\n<span class=\"hljs-keyword\">private<\/span>:\n    <span class=\"hljs-keyword\">static<\/span> Singleton* instance;\n    <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-built_in\">std<\/span>::mutex mtx;\n\n    <span class=\"hljs-comment\">\/\/ Private constructor to prevent instantiation.<\/span>\n    Singleton() {}\n\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-comment\">\/\/ Static method to get the single instance of the class.<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> Singleton* <span class=\"hljs-title\">getInstance<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        <span class=\"hljs-function\"><span class=\"hljs-built_in\">std<\/span>::lock_guard&lt;<span class=\"hljs-built_in\">std<\/span>::mutex&gt; <span class=\"hljs-title\">lock<\/span><span class=\"hljs-params\">(mtx)<\/span><\/span>;\n        <span class=\"hljs-keyword\">if<\/span> (instance == <span class=\"hljs-literal\">nullptr<\/span>) {\n            instance = <span class=\"hljs-keyword\">new<\/span> Singleton();\n        }\n        <span class=\"hljs-keyword\">return<\/span> instance;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">showMessage<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Singleton Instance\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Initialize static member variables.<\/span>\nSingleton* Singleton::instance = <span class=\"hljs-literal\">nullptr<\/span>;\n<span class=\"hljs-built_in\">std<\/span>::mutex Singleton::mtx;\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    Singleton* s1 = Singleton::getInstance();\n    s1-&gt;showMessage();\n\n    Singleton* s2 = Singleton::getInstance();\n    s2-&gt;showMessage();\n\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Factory Method<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Factory Method pattern defines an interface for creating an object, but lets subclasses alter the type of objects that will be created.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Implementation:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\n\n<span class=\"hljs-comment\">\/\/ Product interface<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Product<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">use<\/span><span class=\"hljs-params\">()<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Products<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteProductA<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Product {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">use<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Using ConcreteProductA\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteProductB<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Product {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">use<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Using ConcreteProductB\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Creator class<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Creator<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> Product* <span class=\"hljs-title\">factoryMethod<\/span><span class=\"hljs-params\">()<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">anOperation<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        Product* product = factoryMethod();\n        product-&gt;use();\n        <span class=\"hljs-keyword\">delete<\/span> product;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Creators<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteCreatorA<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Creator {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\">Product* <span class=\"hljs-title\">factoryMethod<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> ConcreteProductA();\n    }\n};\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteCreatorB<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Creator {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\">Product* <span class=\"hljs-title\">factoryMethod<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> ConcreteProductB();\n    }\n};\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    Creator* creatorA = <span class=\"hljs-keyword\">new<\/span> ConcreteCreatorA();\n    creatorA-&gt;anOperation();\n\n    Creator* creatorB = <span class=\"hljs-keyword\">new<\/span> ConcreteCreatorB();\n    creatorB-&gt;anOperation();\n\n    <span class=\"hljs-keyword\">delete<\/span> creatorA;\n    <span class=\"hljs-keyword\">delete<\/span> creatorB;\n\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Abstract Factory<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Abstract Factory pattern provides an interface for creating families of related or dependent objects without specifying their concrete classes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Implementation:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\n\n<span class=\"hljs-comment\">\/\/ Abstract Product A<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">AbstractProductA<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">use<\/span><span class=\"hljs-params\">()<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n};\n\n<span class=\"hljs-comment\">\/\/ Abstract Product B<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">AbstractProductB<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">use<\/span><span class=\"hljs-params\">()<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Product A1<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteProductA1<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> AbstractProductA {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">use<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Using ConcreteProductA1\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Product A2<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteProductA2<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> AbstractProductA {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">use<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Using ConcreteProductA2\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Product B1<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteProductB1<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> AbstractProductB {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">use<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Using ConcreteProductB1\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Product B2<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteProductB2<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> AbstractProductB {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">use<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Using ConcreteProductB2\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Abstract Factory<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">AbstractFactory<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> AbstractProductA* <span class=\"hljs-title\">createProductA<\/span><span class=\"hljs-params\">()<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> AbstractProductB* <span class=\"hljs-title\">createProductB<\/span><span class=\"hljs-params\">()<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Factory 1<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteFactory1<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> AbstractFactory {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\">AbstractProductA* <span class=\"hljs-title\">createProductA<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> ConcreteProductA1();\n    }\n\n    <span class=\"hljs-function\">AbstractProductB* <span class=\"hljs-title\">createProductB<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> ConcreteProductB1();\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Factory 2<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteFactory2<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> AbstractFactory {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\">AbstractProductA* <span class=\"hljs-title\">createProductA<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> ConcreteProductA2();\n    }\n\n    <span class=\"hljs-function\">AbstractProductB* <span class=\"hljs-title\">createProductB<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> ConcreteProductB2();\n    }\n};\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    AbstractFactory* factory1 = <span class=\"hljs-keyword\">new<\/span> ConcreteFactory1();\n    AbstractProductA* productA1 = factory1-&gt;createProductA();\n    AbstractProductB* productB1 = factory1-&gt;createProductB();\n\n    productA1-&gt;use();\n    productB1-&gt;use();\n\n    <span class=\"hljs-keyword\">delete<\/span> productA1;\n    <span class=\"hljs-keyword\">delete<\/span> productB1;\n    <span class=\"hljs-keyword\">delete<\/span> factory1;\n\n    AbstractFactory* factory2 = <span class=\"hljs-keyword\">new<\/span> ConcreteFactory2();\n    AbstractProductA* productA2 = factory2-&gt;createProductA();\n    AbstractProductB* productB2 = factory2-&gt;createProductB();\n\n    productA2-&gt;use();\n    productB2-&gt;use();\n\n    <span class=\"hljs-keyword\">delete<\/span> productA2;\n    <span class=\"hljs-keyword\">delete<\/span> productB2;\n    <span class=\"hljs-keyword\">delete<\/span> factory2;\n\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Builder<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Builder pattern separates the construction of a complex object from its representation so that the same construction process can create different representations.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Implementation:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;string&gt;<\/span><\/span>\n\n<span class=\"hljs-comment\">\/\/ Product<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Product<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">setPartA<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span>&amp; part)<\/span> <\/span>{ partA = part; }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">setPartB<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span>&amp; part)<\/span> <\/span>{ partB = part; }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">setPartC<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span>&amp; part)<\/span> <\/span>{ partC = part; }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">show<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Product Parts: \"<\/span> &lt;&lt; partA &lt;&lt; <span class=\"hljs-string\">\", \"<\/span> &lt;&lt; partB &lt;&lt; <span class=\"hljs-string\">\", \"<\/span> &lt;&lt; partC &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n\n<span class=\"hljs-keyword\">private<\/span>:\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span> partA;\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span> partB;\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span> partC;\n};\n\n<span class=\"hljs-comment\">\/\/ Builder interface<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Builder<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">buildPartA<\/span><span class=\"hljs-params\">()<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">buildPartB<\/span><span class=\"hljs-params\">()<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">buildPartC<\/span><span class=\"hljs-params\">()<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> Product* <span class=\"hljs-title\">getResult<\/span><span class=\"hljs-params\">()<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Builder<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteBuilder<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Builder {\n<span class=\"hljs-keyword\">public<\/span>:\n    ConcreteBuilder() { product = <span class=\"hljs-keyword\">new<\/span> Product(); }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">buildPartA<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        product-&gt;setPartA(<span class=\"hljs-string\">\"PartA1\"<\/span>);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">buildPartB<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        product-&gt;setPartB(<span class=\"hljs-string\">\"PartB1\"<\/span>);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">buildPartC<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        product-&gt;setPartC(<span class=\"hljs-string\">\"PartC1\"<\/span>);\n    }\n\n    <span class=\"hljs-function\">Product* <span class=\"hljs-title\">getResult<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> product;\n    }\n\n<span class=\"hljs-keyword\">private<\/span>:\n    Product* product;\n};\n\n<span class=\"hljs-comment\">\/\/ Director<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Director<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">setBuilder<\/span><span class=\"hljs-params\">(Builder* b)<\/span> <\/span>{ builder = b; }\n\n    <span class=\"hljs-function\">Product* <span class=\"hljs-title\">construct<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        builder-&gt;buildPartA();\n        builder-&gt;buildPartB();\n        builder-&gt;buildPartC();\n        <span class=\"hljs-keyword\">return<\/span> builder-&gt;getResult();\n    }\n\n<span class=\"hljs-keyword\">private<\/span>:\n    Builder* builder;\n};\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    Director director;\n    Builder* builder = <span class=\"hljs-keyword\">new<\/span> ConcreteBuilder();\n\n    director.setBuilder(builder);\n    Product* product = director.construct();\n\n    product-&gt;show();\n\n    <span class=\"hljs-keyword\">delete<\/span> product;\n    <span class=\"hljs-keyword\">delete<\/span> builder;\n\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Prototype<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Prototype pattern is used to create a new object by copying an existing object, known as the prototype.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Implementation:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;unordered_map&gt;<\/span><\/span>\n\n<span class=\"hljs-comment\">\/\/ Prototype interface<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Prototype<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> Prototype* <span class=\"hljs-title\">clone<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">const<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">use<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">const<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-keyword\">virtual<\/span> ~Prototype() = <span class=\"hljs-keyword\">default<\/span>;\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Prototype 1<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcretePrototype1<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Prototype {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\">Prototype* <span class=\"hljs-title\">clone<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> ConcretePrototype1(*<span class=\"hljs-keyword\">this<\/span>);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">use<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Using ConcretePrototype1\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Prototype 2<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcretePrototype2<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Prototype {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\">Prototype* <span class=\"hljs-title\">clone<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> ConcretePrototype2(*<span class=\"hljs-keyword\">this<\/span>);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">use<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Using ConcretePrototype2\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Prototype Factory<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">PrototypeFactory<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    PrototypeFactory() {\n        prototypes&#91;<span class=\"hljs-string\">\"type1\"<\/span>] = <span class=\"hljs-keyword\">new<\/span> ConcretePrototype1();\n        prototypes&#91;<span class=\"hljs-string\">\"type2\"<\/span>] = <span class=\"hljs-keyword\">new<\/span> ConcretePrototype2();\n    }\n\n    ~PrototypeFactory() {\n        <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">auto<\/span>&amp; pair : prototypes) {\n            <span class=\"hljs-keyword\">delete<\/span> pair.second;\n        }\n    }\n\n    <span class=\"hljs-function\">Prototype* <span class=\"hljs-title\">createPrototype<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-built_in\">std<\/span>\n\n::<span class=\"hljs-built_in\">string<\/span>&amp; type)<\/span> <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> prototypes&#91;type]-&gt;clone();\n    }\n\n<span class=\"hljs-keyword\">private<\/span>:\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">unordered_map<\/span>&lt;<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span>, Prototype*&gt; prototypes;\n};\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    PrototypeFactory factory;\n\n    Prototype* prototype1 = factory.createPrototype(<span class=\"hljs-string\">\"type1\"<\/span>);\n    prototype1-&gt;use();\n    <span class=\"hljs-keyword\">delete<\/span> prototype1;\n\n    Prototype* prototype2 = factory.createPrototype(<span class=\"hljs-string\">\"type2\"<\/span>);\n    prototype2-&gt;use();\n    <span class=\"hljs-keyword\">delete<\/span> prototype2;\n\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">2. Structural Patterns<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Adapter<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Adapter pattern allows objects with incompatible interfaces to collaborate. It acts as a bridge between two incompatible interfaces.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Implementation:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\n\n<span class=\"hljs-comment\">\/\/ Target interface<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Target<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">request<\/span><span class=\"hljs-params\">()<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-keyword\">virtual<\/span> ~Target() = <span class=\"hljs-keyword\">default<\/span>;\n};\n\n<span class=\"hljs-comment\">\/\/ Adaptee class with a specific interface<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Adaptee<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">specificRequest<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Adaptee specific request\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Adapter class that makes Adaptee compatible with Target<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Adapter<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Target {\n<span class=\"hljs-keyword\">public<\/span>:\n    Adapter(Adaptee* adaptee) : adaptee(adaptee) {}\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">request<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        adaptee-&gt;specificRequest();\n    }\n\n<span class=\"hljs-keyword\">private<\/span>:\n    Adaptee* adaptee;\n};\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    Adaptee* adaptee = <span class=\"hljs-keyword\">new<\/span> Adaptee();\n    Target* adapter = <span class=\"hljs-keyword\">new<\/span> Adapter(adaptee);\n\n    adapter-&gt;request();\n\n    <span class=\"hljs-keyword\">delete<\/span> adapter;\n    <span class=\"hljs-keyword\">delete<\/span> adaptee;\n\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Composite<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Composite pattern allows you to compose objects into tree structures to represent part-whole hierarchies. It lets clients treat individual objects and compositions of objects uniformly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Implementation:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;vector&gt;<\/span><\/span>\n\n<span class=\"hljs-comment\">\/\/ Component interface<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Component<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">operation<\/span><span class=\"hljs-params\">()<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">add<\/span><span class=\"hljs-params\">(Component* component)<\/span> <\/span>{}\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">remove<\/span><span class=\"hljs-params\">(Component* component)<\/span> <\/span>{}\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> Component* <span class=\"hljs-title\">getChild<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> index)<\/span> <\/span>{ <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">nullptr<\/span>; }\n    <span class=\"hljs-keyword\">virtual<\/span> ~Component() = <span class=\"hljs-keyword\">default<\/span>;\n};\n\n<span class=\"hljs-comment\">\/\/ Leaf class representing a leaf node in the tree<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Leaf<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Component {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">operation<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Leaf operation\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Composite class representing a composite node in the tree<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Composite<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Component {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">operation<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Composite operation\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n        <span class=\"hljs-keyword\">for<\/span> (Component* component : children) {\n            component-&gt;operation();\n        }\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">add<\/span><span class=\"hljs-params\">(Component* component)<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        children.push_back(component);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">remove<\/span><span class=\"hljs-params\">(Component* component)<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        children.erase(<span class=\"hljs-built_in\">std<\/span>::remove(children.begin(), children.end(), component), children.end());\n    }\n\n    <span class=\"hljs-function\">Component* <span class=\"hljs-title\">getChild<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> index)<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> children.at(index);\n    }\n\n<span class=\"hljs-keyword\">private<\/span>:\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;Component*&gt; children;\n};\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    Component* leaf1 = <span class=\"hljs-keyword\">new<\/span> Leaf();\n    Component* leaf2 = <span class=\"hljs-keyword\">new<\/span> Leaf();\n    Component* composite = <span class=\"hljs-keyword\">new<\/span> Composite();\n\n    composite-&gt;add(leaf1);\n    composite-&gt;add(leaf2);\n\n    composite-&gt;operation();\n\n    <span class=\"hljs-keyword\">delete<\/span> composite;\n    <span class=\"hljs-keyword\">delete<\/span> leaf2;\n    <span class=\"hljs-keyword\">delete<\/span> leaf1;\n\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Proxy<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Proxy pattern provides a surrogate or placeholder for another object to control access to it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Implementation:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\n\n<span class=\"hljs-comment\">\/\/ Subject interface<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Subject<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">request<\/span><span class=\"hljs-params\">()<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-keyword\">virtual<\/span> ~Subject() = <span class=\"hljs-keyword\">default<\/span>;\n};\n\n<span class=\"hljs-comment\">\/\/ RealSubject class<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">RealSubject<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Subject {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">request<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"RealSubject request\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Proxy class<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Proxy<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Subject {\n<span class=\"hljs-keyword\">public<\/span>:\n    Proxy(RealSubject* realSubject) : realSubject(realSubject) {}\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">request<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Proxy request\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n        realSubject-&gt;request();\n    }\n\n<span class=\"hljs-keyword\">private<\/span>:\n    RealSubject* realSubject;\n};\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    RealSubject* realSubject = <span class=\"hljs-keyword\">new<\/span> RealSubject();\n    Proxy* proxy = <span class=\"hljs-keyword\">new<\/span> Proxy(realSubject);\n\n    proxy-&gt;request();\n\n    <span class=\"hljs-keyword\">delete<\/span> proxy;\n    <span class=\"hljs-keyword\">delete<\/span> realSubject;\n\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Flyweight<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Flyweight pattern is used to minimize memory usage or computational expenses by sharing as much as possible with similar objects.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Implementation:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;unordered_map&gt;<\/span><\/span>\n\n<span class=\"hljs-comment\">\/\/ Flyweight interface<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Flyweight<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">operation<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> extrinsicState)<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-keyword\">virtual<\/span> ~Flyweight() = <span class=\"hljs-keyword\">default<\/span>;\n};\n\n<span class=\"hljs-comment\">\/\/ ConcreteFlyweight class<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteFlyweight<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Flyweight {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">operation<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> extrinsicState)<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"ConcreteFlyweight: \"<\/span> &lt;&lt; extrinsicState &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ FlyweightFactory class<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">FlyweightFactory<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\">Flyweight* <span class=\"hljs-title\">getFlyweight<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span>&amp; key)<\/span> <\/span>{\n        <span class=\"hljs-keyword\">if<\/span> (flyweights.find(key) == flyweights.end()) {\n            flyweights&#91;key] = <span class=\"hljs-keyword\">new<\/span> ConcreteFlyweight();\n        }\n        <span class=\"hljs-keyword\">return<\/span> flyweights&#91;key];\n    }\n\n    ~FlyweightFactory() {\n        <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">auto<\/span>&amp; pair : flyweights) {\n            <span class=\"hljs-keyword\">delete<\/span> pair.second;\n        }\n    }\n\n<span class=\"hljs-keyword\">private<\/span>:\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">unordered_map<\/span>&lt;<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span>, Flyweight*&gt; flyweights;\n};\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    FlyweightFactory factory;\n\n    Flyweight* flyweight1 = factory.getFlyweight(<span class=\"hljs-string\">\"key1\"<\/span>);\n    Flyweight* flyweight2 = factory.getFlyweight(<span class=\"hljs-string\">\"key2\"<\/span>);\n    Flyweight* flyweight3 = factory.getFlyweight(<span class=\"hljs-string\">\"key1\"<\/span>);\n\n    flyweight1-&gt;operation(<span class=\"hljs-number\">1<\/span>);\n    flyweight2-&gt;operation(<span class=\"hljs-number\">2<\/span>);\n    flyweight3-&gt;operation(<span class=\"hljs-number\">3<\/span>);\n\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Facade<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Facade pattern provides a simplified interface to a complex subsystem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Implementation:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\n\n<span class=\"hljs-comment\">\/\/ Subsystem 1<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Subsystem1<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">operation1<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Subsystem1 operation1\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Subsystem 2<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Subsystem2<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">operation2<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Subsystem2 operation2\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Facade class<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Facade<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    Facade() : subsystem1(<span class=\"hljs-keyword\">new<\/span> Subsystem1()), subsystem2(<span class=\"hljs-keyword\">new<\/span> Subsystem2()) {}\n\n    ~Facade() {\n        <span class=\"hljs-keyword\">delete<\/span> subsystem1;\n        <span class=\"hljs-keyword\">delete<\/span> subsystem2;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">operation<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        subsystem1-&gt;operation1();\n        subsystem2-&gt;operation2();\n    }\n\n<span class=\"hljs-keyword\">private<\/span>:\n    Subsystem1* subsystem1;\n    Subsystem2* subsystem2;\n};\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    Facade facade;\n    facade.operation();\n\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Bridge<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Bridge pattern decouples an abstraction from its implementation so that the two can vary independently.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Implementation:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\n\n<span class=\"hljs-comment\">\/\/ Implementor interface<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Implementor<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">operationImpl<\/span><span class=\"hljs-params\">()<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-keyword\">virtual<\/span> ~Implementor() = <span class=\"hljs-keyword\">default<\/span>;\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Implementor A<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteImplementorA<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Implementor {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">operationImpl<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"ConcreteImplementorA operation\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Implementor B<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteImplementorB<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Implementor {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">operationImpl<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"ConcreteImplementorB operation\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Abstraction class<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Abstraction<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    Abstraction(Implementor* impl) : implementor(impl) {}\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">operation<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        implementor-&gt;operationImpl();\n    }\n\n<span class=\"hljs-keyword\">protected<\/span>:\n    Implementor* implementor;\n};\n\n<span class=\"hljs-comment\">\/\/ Refined Abstraction class<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">RefinedAbstraction<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Abstraction {\n<span class=\"hljs-keyword\">public<\/span>:\n    RefinedAbstraction(Implementor* impl) : Abstraction(impl) {}\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">operation<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        implementor-&gt;operationImpl();\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"RefinedAbstraction operation\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    Implementor* implA = <span class=\"hljs-keyword\">new<\/span> ConcreteImplementorA();\n    Abstraction* abstractionA = <span class=\"hljs-keyword\">new<\/span> RefinedAbstraction(implA);\n\n    abstractionA-&gt;operation();\n\n    <span class=\"hljs-keyword\">delete<\/span> abstractionA;\n    <span class=\"hljs-keyword\">delete<\/span> implA;\n\n    Implementor* implB = <span class=\"hljs-keyword\">new<\/span> ConcreteImplementorB();\n    Abstraction* abstractionB = <span class=\"hljs-keyword\">new<\/span> RefinedAbstraction(implB);\n\n    abstractionB-&gt;operation();\n\n    <span class=\"hljs-keyword\">delete<\/span> abstractionB;\n    <span class=\"hljs-keyword\">delete<\/span> implB;\n\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Decorator<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Decorator pattern allows behavior to be added to an individual object, dynamically, without affecting the behavior of other objects from the same class.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Implementation:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\n\n<span class=\"hljs-comment\">\/\/ Component interface<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Component<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">operation<\/span><span class=\"hljs-params\">()<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-keyword\">virtual<\/span> ~Component() = <span class=\"hljs-keyword\">default<\/span>;\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Component<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteComponent<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Component {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">operation<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"ConcreteComponent operation\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Decorator class<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Decorator<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Component {\n<span class=\"hljs-keyword\">public<\/span>:\n    Decorator(Component* component) : component(component) {}\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">operation<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        component-&gt;operation();\n    }\n\n<span class=\"hljs-keyword\">protected<\/span>:\n    Component* component;\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Decorator A<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteDecoratorA<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Decorator {\n<span class=\"hljs-keyword\">public<\/span>:\n    ConcreteDecoratorA(Component* component) : Decorator(component) {}\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">operation<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        Decorator::operation();\n        addedBehavior();\n    }\n\n<span class=\"hljs-keyword\">private<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">addedBehavior<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"ConcreteDecoratorA added behavior\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Decorator B<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteDecoratorB<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Decorator {\n<span class=\"hljs-keyword\">public<\/span>:\n    ConcreteDecoratorB(Component* component) : Decorator(component) {}\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">operation<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span>\n\n <\/span>{\n        Decorator::operation();\n        addedBehavior();\n    }\n\n<span class=\"hljs-keyword\">private<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">addedBehavior<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"ConcreteDecoratorB added behavior\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    Component* component = <span class=\"hljs-keyword\">new<\/span> ConcreteComponent();\n    Component* decoratorA = <span class=\"hljs-keyword\">new<\/span> ConcreteDecoratorA(component);\n    Component* decoratorB = <span class=\"hljs-keyword\">new<\/span> ConcreteDecoratorB(decoratorA);\n\n    decoratorB-&gt;operation();\n\n    <span class=\"hljs-keyword\">delete<\/span> decoratorB;\n    <span class=\"hljs-keyword\">delete<\/span> decoratorA;\n    <span class=\"hljs-keyword\">delete<\/span> component;\n\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">3. Behavioral Patterns<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Strategy<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Strategy pattern defines a family of algorithms, encapsulates each one, and makes them interchangeable. It lets the algorithm vary independently from clients that use it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Implementation:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\n\n<span class=\"hljs-comment\">\/\/ Strategy interface<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Strategy<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">algorithmInterface<\/span><span class=\"hljs-params\">()<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-keyword\">virtual<\/span> ~Strategy() = <span class=\"hljs-keyword\">default<\/span>;\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Strategy A<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteStrategyA<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Strategy {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">algorithmInterface<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"ConcreteStrategyA algorithm\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Strategy B<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteStrategyB<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Strategy {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">algorithmInterface<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"ConcreteStrategyB algorithm\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Context class<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Context<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">setStrategy<\/span><span class=\"hljs-params\">(Strategy* strategy)<\/span> <\/span>{\n        <span class=\"hljs-keyword\">this<\/span>-&gt;strategy = strategy;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">executeStrategy<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        strategy-&gt;algorithmInterface();\n    }\n\n<span class=\"hljs-keyword\">private<\/span>:\n    Strategy* strategy;\n};\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    Context context;\n\n    Strategy* strategyA = <span class=\"hljs-keyword\">new<\/span> ConcreteStrategyA();\n    Strategy* strategyB = <span class=\"hljs-keyword\">new<\/span> ConcreteStrategyB();\n\n    context.setStrategy(strategyA);\n    context.executeStrategy();\n\n    context.setStrategy(strategyB);\n    context.executeStrategy();\n\n    <span class=\"hljs-keyword\">delete<\/span> strategyA;\n    <span class=\"hljs-keyword\">delete<\/span> strategyB;\n\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Observer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Observer pattern defines a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Implementation:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;vector&gt;<\/span><\/span>\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;algorithm&gt;<\/span><\/span>\n\n<span class=\"hljs-comment\">\/\/ Observer interface<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Observer<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">update<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> state)<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-keyword\">virtual<\/span> ~Observer() = <span class=\"hljs-keyword\">default<\/span>;\n};\n\n<span class=\"hljs-comment\">\/\/ Subject class<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Subject<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">attach<\/span><span class=\"hljs-params\">(Observer* observer)<\/span> <\/span>{\n        observers.push_back(observer);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">detach<\/span><span class=\"hljs-params\">(Observer* observer)<\/span> <\/span>{\n        observers.erase(<span class=\"hljs-built_in\">std<\/span>::remove(observers.begin(), observers.end(), observer), observers.end());\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">notify<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        <span class=\"hljs-keyword\">for<\/span> (Observer* observer : observers) {\n            observer-&gt;update(state);\n        }\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">setState<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> state)<\/span> <\/span>{\n        <span class=\"hljs-keyword\">this<\/span>-&gt;state = state;\n        notify();\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">getState<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">const<\/span> <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> state;\n    }\n\n<span class=\"hljs-keyword\">private<\/span>:\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;Observer*&gt; observers;\n    <span class=\"hljs-keyword\">int<\/span> state;\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Observer A<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteObserverA<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Observer {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">update<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> state)<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"ConcreteObserverA: \"<\/span> &lt;&lt; state &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Observer B<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteObserverB<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Observer {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">update<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> state)<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"ConcreteObserverB: \"<\/span> &lt;&lt; state &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    Subject subject;\n\n    Observer* observerA = <span class=\"hljs-keyword\">new<\/span> ConcreteObserverA();\n    Observer* observerB = <span class=\"hljs-keyword\">new<\/span> ConcreteObserverB();\n\n    subject.attach(observerA);\n    subject.attach(observerB);\n\n    subject.setState(<span class=\"hljs-number\">1<\/span>);\n    subject.setState(<span class=\"hljs-number\">2<\/span>);\n\n    subject.detach(observerA);\n    subject.setState(<span class=\"hljs-number\">3<\/span>);\n\n    <span class=\"hljs-keyword\">delete<\/span> observerA;\n    <span class=\"hljs-keyword\">delete<\/span> observerB;\n\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Command<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Command pattern encapsulates a request as an object, thereby allowing for parameterization of clients with queues, requests, and operations.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Implementation:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;vector&gt;<\/span><\/span>\n\n<span class=\"hljs-comment\">\/\/ Command interface<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Command<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">execute<\/span><span class=\"hljs-params\">()<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-keyword\">virtual<\/span> ~Command() = <span class=\"hljs-keyword\">default<\/span>;\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Command<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteCommand<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Command {\n<span class=\"hljs-keyword\">public<\/span>:\n    ConcreteCommand(<span class=\"hljs-keyword\">int<\/span> payload) : payload(payload) {}\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">execute<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Executing command with payload: \"<\/span> &lt;&lt; payload &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n\n<span class=\"hljs-keyword\">private<\/span>:\n    <span class=\"hljs-keyword\">int<\/span> payload;\n};\n\n<span class=\"hljs-comment\">\/\/ Invoker class<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Invoker<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">setCommand<\/span><span class=\"hljs-params\">(Command* command)<\/span> <\/span>{\n        <span class=\"hljs-keyword\">this<\/span>-&gt;command = command;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">executeCommand<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        <span class=\"hljs-keyword\">if<\/span> (command) {\n            command-&gt;execute();\n        }\n    }\n\n<span class=\"hljs-keyword\">private<\/span>:\n    Command* command = <span class=\"hljs-literal\">nullptr<\/span>;\n};\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    Invoker invoker;\n\n    Command* command1 = <span class=\"hljs-keyword\">new<\/span> ConcreteCommand(<span class=\"hljs-number\">10<\/span>);\n    Command* command2 = <span class=\"hljs-keyword\">new<\/span> ConcreteCommand(<span class=\"hljs-number\">20<\/span>);\n\n    invoker.setCommand(command1);\n    invoker.executeCommand();\n\n    invoker.setCommand(command2);\n    invoker.executeCommand();\n\n    <span class=\"hljs-keyword\">delete<\/span> command1;\n    <span class=\"hljs-keyword\">delete<\/span> command2;\n\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Chain of Responsibility<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Chain of Responsibility pattern avoids coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Implementation:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\n\n<span class=\"hljs-comment\">\/\/ Handler interface<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Handler<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">setNext<\/span><span class=\"hljs-params\">(Handler* next)<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">handleRequest<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> request)<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-keyword\">virtual<\/span> ~Handler() = <span class=\"hljs-keyword\">default<\/span>;\n};\n\n<span class=\"hljs-comment\">\/\/ Abstract Handler<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">AbstractHandler<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Handler {\n<span class=\"hljs-keyword\">public<\/span>:\n    AbstractHandler() : nextHandler(<span class=\"hljs-literal\">nullptr<\/span>) {}\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">setNext<\/span><span class=\"hljs-params\">(Handler* next)<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        nextHandler = next;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">handleRequest<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> request)<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-keyword\">if<\/span> (nextHandler) {\n            nextHandler-&gt;handleRequest(request);\n        } <span class=\"hljs-keyword\">else<\/span> {\n            <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Request \"<\/span> &lt;&lt; request &lt;&lt; <span class=\"hljs-string\">\" unhandled\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n        }\n    }\n\n<span class=\"hljs-keyword\">protected<\/span>:\n    Handler* nextHandler;\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Handler 1<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteHandler1<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> AbstractHandler {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">handleRequest<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> request)<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-keyword\">if<\/span> (request &lt; <span class=\"hljs-number\">10<\/span>) {\n            <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"ConcreteHandler1 handled request \"<\/span> &lt;&lt; request &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n        } <span class=\"hljs-keyword\">else<\/span> {\n            AbstractHandler::handleRequest(request);\n        }\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Handler 2<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteHandler2<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> AbstractHandler {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">handleRequest<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> request)<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-keyword\">if<\/span> (request &gt;= <span class=\"hljs-number\">10<\/span> &amp;&amp; request &lt; <span class=\"hljs-number\">20<\/span>) {\n            <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"ConcreteHandler2 handled request \"<\/span> &lt;&lt; request &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n        } <span class=\"hljs-keyword\">else<\/span> {\n            AbstractHandler::handleRequest(request);\n        }\n    }\n};\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    Handler* handler1 = <span class=\"hljs-keyword\">new<\/span> ConcreteHandler1();\n    Handler* handler2 = <span class=\"hljs-keyword\">new<\/span> ConcreteHandler2();\n\n    handler1-&gt;setNext(handler2);\n\n    handler1-&gt;handleRequest(<span class=\"hljs-number\">5<\/span>);\n    handler1-&gt;handleRequest(<span class=\"hljs-number\">15<\/span>);\n    handler1-&gt;handleRequest(<span class=\"hljs-number\">25<\/span>);\n\n    <span class=\"hljs-keyword\">delete<\/span> handler1;\n    <span class=\"hljs-keyword\">delete<\/span> handler2;\n\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">State<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The State pattern allows an object to alter its behavior when its internal state changes. The object will appear to change its class.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Implementation:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\n\n<span class=\"hljs-comment\">\/\/ Context class<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Context<\/span>;<\/span>\n\n<span class=\"hljs-comment\">\/\/ State interface<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">State<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">handle<\/span><span class=\"hljs-params\">(Context* context)<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-keyword\">virtual<\/span> ~State() = <span class=\"hljs-keyword\">default<\/span>;\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete State A<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteStateA<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> State {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">handle<\/span><span class=\"hljs-params\">(Context* context)<\/span> <span class=\"hljs-keyword\">override<\/span><\/span>;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> ConcreteStateA* <span class=\"hljs-title\">getInstance<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        <span class=\"hljs-keyword\">static<\/span> ConcreteStateA instance;\n        <span class=\"hljs-keyword\">return<\/span> &amp;instance;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete State B<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteStateB<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> State {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">handle<\/span><span class=\"hljs-params\">(Context* context)<\/span> <span class=\"hljs-keyword\">override<\/span><\/span>;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> ConcreteStateB* <span class=\"hljs-title\">getInstance<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        <span class=\"hljs-keyword\">static<\/span> ConcreteStateB instance;\n        <span class=\"hljs-keyword\">return<\/span> &amp;instance;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Context class<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Context<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    Context() : state(ConcreteStateA::getInstance()) {}\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">setState<\/span><span class=\"hljs-params\">(State* state)<\/span> <\/span>{\n        <span class=\"hljs-keyword\">this<\/span>-&gt;state = state;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">request<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        state-&gt;handle(<span class=\"hljs-keyword\">this<\/span>);\n    }\n\n<span class=\"hljs-keyword\">private<\/span>:\n    State* state;\n};\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">ConcreteStateA::handle<\/span><span class=\"hljs-params\">(Context* context)<\/span> <\/span>{\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"ConcreteStateA handling request\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    context-&gt;setState(ConcreteStateB::getInstance());\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">ConcreteStateB::handle<\/span><span class=\"hljs-params\">(Context* context)<\/span> <\/span>{\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"ConcreteStateB handling request\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    context-&gt;setState(ConcreteStateA::getInstance());\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    Context context;\n\n    context.request();\n    context.request();\n    context.request();\n\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Template Method<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Template Method pattern defines the skeleton of an algorithm in an operation, deferring some steps to subclasses. It lets subclasses redefine certain steps of an algorithm without changing the algorithm&#8217;s structure.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Implementation:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\n\n<span class=\"hljs-comment\">\/\/ Abstract Class<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">AbstractClass<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">templateMethod<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        primitiveOperation1();\n        primitiveOperation2();\n    }\n\n<span class=\"hljs-keyword\">protected<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">primitiveOperation1<\/span><span class=\"hljs-params\">()<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">primitiveOperation2<\/span><span class=\"hljs-params\">()<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-keyword\">virtual<\/span> ~AbstractClass() = <span class=\"hljs-keyword\">default<\/span>;\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Class<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteClass<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> AbstractClass {\n<span class=\"hljs-keyword\">protected<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">primitiveOperation1<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"ConcreteClass primitiveOperation1\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">primitiveOperation2<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"ConcreteClass primitiveOperation2\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    AbstractClass* instance = <span class=\"hljs-keyword\">new<\/span> ConcreteClass();\n    instance-&gt;templateMethod();\n\n    <span class=\"hljs-keyword\">delete<\/span> instance;\n\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Iterator<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Iterator pattern provides a way to access the elements of an aggregate object sequentially without exposing its underlying representation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Implementation<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;vector&gt;<\/span><\/span>\n\n<span class=\"hljs-comment\">\/\/ Iterator interface<\/span>\n<span class=\"hljs-keyword\">template<\/span> &lt;<span class=\"hljs-keyword\">typename<\/span> T&gt;\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Iterator<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">bool<\/span> <span class=\"hljs-title\">hasNext<\/span><span class=\"hljs-params\">()<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> T <span class=\"hljs-title\">next<\/span><span class=\"hljs-params\">()<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-keyword\">virtual<\/span> ~Iterator() = <span class=\"hljs-keyword\">default<\/span>;\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Iterator<\/span>\n<span class=\"hljs-keyword\">template<\/span> &lt;<span class=\"hljs-keyword\">typename<\/span> T&gt;\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteIterator<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Iterator&lt;T&gt; {\n<span class=\"hljs-keyword\">public<\/span>:\n    ConcreteIterator(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;T&gt;&amp; collection) : collection(collection), index(<span class=\"hljs-number\">0<\/span>) {}\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">bool<\/span> <span class=\"hljs-title\">hasNext<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> index &lt; collection.size();\n    }\n\n    <span class=\"hljs-function\">T <span class=\"hljs-title\">next<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> collection&#91;index++];\n    }\n\n<span class=\"hljs-keyword\">private<\/span>:\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;T&gt; collection;\n    <span class=\"hljs-keyword\">size_t<\/span> index;\n};\n\n<span class=\"hljs-comment\">\/\/ Aggregate interface<\/span>\n<span class=\"hljs-keyword\">template<\/span> &lt;<span class=\"hljs-keyword\">typename<\/span> T&gt;\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Aggregate<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> Iterator&lt;T&gt;* <span class=\"hljs-title\">createIterator<\/span><span class=\"hljs-params\">()<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-keyword\">virtual<\/span> ~Aggregate() = <span class=\"hljs-keyword\">default<\/span>;\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Aggregate<\/span>\n<span class=\"hljs-keyword\">template<\/span> &lt;<span class=\"hljs-keyword\">typename<\/span> T&gt;\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteAggregate<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Aggregate&lt;T&gt; {\n<span class=\"hljs-keyword\">public<\/span>:\n    ConcreteAggregate(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;T&gt;&amp; collection) : collection(collection) {}\n\n    <span class=\"hljs-function\">Iterator&lt;T&gt;* <span class=\"hljs-title\">createIterator<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> ConcreteIterator&lt;T&gt;(collection);\n    }\n\n<span class=\"hljs-keyword\">private<\/span>:\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;T&gt; collection;\n};\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; collection = {<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">5<\/span>};\n    Aggregate&lt;<span class=\"hljs-keyword\">int<\/span>&gt;* aggregate = <span class=\"hljs-keyword\">new<\/span> ConcreteAggregate&lt;<span class=\"hljs-keyword\">int<\/span>&gt;(collection);\n\n    Iterator&lt;<span class=\"hljs-keyword\">int<\/span>&gt;* iterator = aggregate-&gt;createIterator();\n    <span class=\"hljs-keyword\">while<\/span> (iterator-&gt;hasNext()) {\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; iterator-&gt;next() &lt;&lt; <span class=\"hljs-string\">\" \"<\/span>;\n    }\n\n    <span class=\"hljs-keyword\">delete<\/span> iterator;\n    <span class=\"hljs-keyword\">delete<\/span> aggregate;\n\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Mediator<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Mediator pattern defines an object that encapsulates how a set of objects interact. It promotes loose coupling by keeping objects from referring to each other explicitly and lets you vary their interaction independently.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Implementation:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;string&gt;<\/span><\/span>\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;vector&gt;<\/span><\/span>\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Colleague<\/span>;<\/span>\n\n<span class=\"hljs-comment\">\/\/ Mediator interface<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Mediator<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">send<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span>&amp; message, Colleague* colleague)<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n    <span class=\"hljs-keyword\">virtual<\/span> ~Mediator() = <span class=\"hljs-keyword\">default<\/span>;\n};\n\n<span class=\"hljs-comment\">\/\/ Colleague class<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Colleague<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    Colleague(Mediator* mediator) : mediator(mediator) {}\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">send<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span>&amp; message)<\/span> <\/span>{\n        mediator-&gt;send(message, <span class=\"hljs-keyword\">this<\/span>);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">receive<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span>&amp; message)<\/span> <\/span>= <span class=\"hljs-number\">0<\/span>;\n\n<span class=\"hljs-keyword\">protected<\/span>:\n    Mediator* mediator;\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Mediator<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteMediator<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Mediator {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">addColleague<\/span><span class=\"hljs-params\">(Colleague* colleague)<\/span> <\/span>{\n        colleagues.push_back(colleague);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">send<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span>&amp; message, Colleague* sender)<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-keyword\">for<\/span> (Colleague* colleague : colleagues) {\n            <span class=\"hljs-keyword\">if<\/span> (colleague != sender) {\n                colleague-&gt;receive(message);\n            }\n        }\n    }\n\n<span class=\"hljs-keyword\">private<\/span>:\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;Colleague*&gt; colleagues;\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Colleague 1<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteColleague1<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Colleague {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-keyword\">using<\/span> Colleague::Colleague;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">receive<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span>&amp; message)<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"ConcreteColleague1 received: \"<\/span> &lt;&lt; message &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-comment\">\/\/ Concrete Colleague 2<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteColleague2<\/span> :<\/span> <span class=\"hljs-keyword\">public<\/span> Colleague {\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-keyword\">using<\/span> Colleague::Colleague;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">receive<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span>&amp; message)<\/span> <span class=\"hljs-keyword\">override<\/span> <\/span>{\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"ConcreteColleague2 received: \"<\/span> &lt;&lt; message &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n};\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    ConcreteMediator mediator;\n\n    ConcreteColleague1* colleague1 = <span class=\"hljs-keyword\">new<\/span> ConcreteColleague1(&amp;mediator);\n    ConcreteColleague2* colleague2 = <span class=\"hljs-keyword\">new<\/span> ConcreteColleague2(&amp;mediator);\n\n    mediator.addColleague(colleague1);\n    mediator.addColleague(colleague2);\n\n    colleague1-&gt;send(<span class=\"hljs-string\">\"Hello from Colleague1\"<\/span>);\n    colleague2-&gt;send(<span class=\"hljs-string\">\"Hello from Colleague2\"<\/span>);\n\n    <span class=\"hljs-keyword\">delete<\/span> colleague1;\n    <span class=\"hljs-keyword\">delete<\/span> colleague2;\n\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Memento<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Memento pattern provides the ability to restore an object to its previous state (undo via rollback).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Implementation:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;string&gt;<\/span><\/span>\n\n<span class=\"hljs-comment\">\/\/ Memento class<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Memento<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    Memento(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span>&amp; state) : state(state) {}\n\n    <span class=\"hljs-function\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span> <span class=\"hljs-title\">getState<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">const<\/span> <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> state;\n    }\n\n<span class=\"hljs-keyword\">private<\/span>:\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span> state;\n};\n\n<span class=\"hljs-comment\">\/\/ Originator class<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Originator<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">setState<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span>&amp; state)<\/span> <\/span>{\n        <span class=\"hljs-keyword\">this<\/span>-&gt;state = state;\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"State set to: \"<\/span> &lt;&lt; state &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span> <span class=\"hljs-title\">getState<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">const<\/span> <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> state;\n    }\n\n    <span class=\"hljs-function\">Memento* <span class=\"hljs-title\">saveStateToMemento<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> Memento(state);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">getStateFromMemento<\/span><span class=\"hljs-params\">(Memento* memento)<\/span> <\/span>{\n        state = memento-&gt;getState();\n    }\n\n<span class=\"hljs-keyword\">private<\/span>:\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span> state;\n};\n\n<span class=\"hljs-comment\">\/\/ Caretaker class<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Caretaker<\/span> {<\/span>\n<span class=\"hljs-keyword\">public<\/span>:\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">addMemento<\/span><span class=\"hljs-params\">(Memento* memento)<\/span> <\/span>{\n        mementos.push_back(memento);\n    }\n\n    <span class=\"hljs-function\">Memento* <span class=\"hljs-title\">getMemento<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> index)<\/span> <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> mementos&#91;index];\n    }\n\n    ~Caretaker() {\n        <span class=\"hljs-keyword\">for<\/span> (Memento* memento : mementos) {\n            <span class=\"hljs-keyword\">delete<\/span> memento;\n        }\n    }\n\n<span class=\"hljs-keyword\">private<\/span>:\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;Memento*&gt; mementos;\n};\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    Originator originator;\n    Caretaker caretaker;\n\n    originator.setState(<span class=\"hljs-string\">\"State1\"<\/span>);\n    caretaker.addMemento(originator.saveStateToMemento());\n\n    originator.setState(<span class=\"hljs-string\">\"State2\"<\/span>);\n    caretaker.addMemento(originator.saveStateToMemento());\n\n    originator.setState(<span class=\"hljs-string\">\"State3\"<\/span>);\n\n    originator.getStateFromMemento(caretaker.getMemento(<span class=\"hljs-number\">0<\/span>));\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"First saved state: \"<\/span> &lt;&lt; originator.getState() &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n\n    originator.getStateFromMemento(caretaker.getMemento(<span class=\"hljs-number\">1<\/span>));\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Second saved state: \"<\/span> &lt;&lt; originator.getState() &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Design patterns are an essential toolkit for any software developer. They provide tested, proven development paradigms that enhance code readability, maintainability, and reusability. In this tutorial, we&#8217;ve covered various creational, structural, and behavioral design patterns, explaining their concepts and providing C++ implementations.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As you continue to grow as a developer, you&#8217;ll find that understanding and applying these patterns will help you solve complex design problems more efficiently. Practice implementing these patterns in your projects, and you&#8217;ll gain a deeper insight into their practical benefits and usage.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Design patterns are typical solutions to commonly occurring problems in software design. They represent best practices used by experienced object-oriented software developers. Design patterns are like pre-defined blueprints that can be customized to solve recurring design problems in various contexts. In this tutorial, we will explore several fundamental design patterns and implement them in [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[9,4],"tags":[],"class_list":["post-1961","post","type-post","status-publish","format-standard","category-cplusplus","category-programming-languages","entry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How to Implement Design Patterns in C++<\/title>\n<meta name=\"description\" content=\"Design patterns are typical solutions to commonly occurring problems in software design. They represent best practices used by experienced\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.w3computing.com\/articles\/how-to-implement-design-patterns-in-cpp\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Implement Design Patterns in C++\" \/>\n<meta property=\"og:description\" content=\"Design patterns are typical solutions to commonly occurring problems in software design. They represent best practices used by experienced\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.w3computing.com\/articles\/how-to-implement-design-patterns-in-cpp\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-06-22T09:39:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-06-22T23:32:54+00:00\" \/>\n<meta name=\"author\" content=\"w3compadmin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"w3compadmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"TechArticle\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-implement-design-patterns-in-cpp\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-implement-design-patterns-in-cpp\\\/\"},\"author\":{\"name\":\"w3compadmin\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"headline\":\"How to Implement Design Patterns in C++\",\"datePublished\":\"2024-06-22T09:39:09+00:00\",\"dateModified\":\"2024-06-22T23:32:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-implement-design-patterns-in-cpp\\\/\"},\"wordCount\":761,\"articleSection\":[\"C++\",\"Programming Languages\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-implement-design-patterns-in-cpp\\\/\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-implement-design-patterns-in-cpp\\\/\",\"name\":\"How to Implement Design Patterns in C++\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\"},\"datePublished\":\"2024-06-22T09:39:09+00:00\",\"dateModified\":\"2024-06-22T23:32:54+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"description\":\"Design patterns are typical solutions to commonly occurring problems in software design. They represent best practices used by experienced\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-implement-design-patterns-in-cpp\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-implement-design-patterns-in-cpp\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-implement-design-patterns-in-cpp\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Articles Home\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Programming Languages\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/programming-languages\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"How to Implement Design Patterns in C++\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\",\"name\":\"Developer Articles Hub\",\"description\":\"\",\"alternateName\":\"Developer Articles\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\",\"name\":\"w3compadmin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"contentUrl\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"caption\":\"w3compadmin\"},\"sameAs\":[\"http:\\\/\\\/w3computing.com\\\/articles\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Implement Design Patterns in C++","description":"Design patterns are typical solutions to commonly occurring problems in software design. They represent best practices used by experienced","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.w3computing.com\/articles\/how-to-implement-design-patterns-in-cpp\/","og_locale":"en_US","og_type":"article","og_title":"How to Implement Design Patterns in C++","og_description":"Design patterns are typical solutions to commonly occurring problems in software design. They represent best practices used by experienced","og_url":"https:\/\/www.w3computing.com\/articles\/how-to-implement-design-patterns-in-cpp\/","article_published_time":"2024-06-22T09:39:09+00:00","article_modified_time":"2024-06-22T23:32:54+00:00","author":"w3compadmin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"w3compadmin","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"TechArticle","@id":"https:\/\/www.w3computing.com\/articles\/how-to-implement-design-patterns-in-cpp\/#article","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/how-to-implement-design-patterns-in-cpp\/"},"author":{"name":"w3compadmin","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"headline":"How to Implement Design Patterns in C++","datePublished":"2024-06-22T09:39:09+00:00","dateModified":"2024-06-22T23:32:54+00:00","mainEntityOfPage":{"@id":"https:\/\/www.w3computing.com\/articles\/how-to-implement-design-patterns-in-cpp\/"},"wordCount":761,"articleSection":["C++","Programming Languages"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.w3computing.com\/articles\/how-to-implement-design-patterns-in-cpp\/","url":"https:\/\/www.w3computing.com\/articles\/how-to-implement-design-patterns-in-cpp\/","name":"How to Implement Design Patterns in C++","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/#website"},"datePublished":"2024-06-22T09:39:09+00:00","dateModified":"2024-06-22T23:32:54+00:00","author":{"@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"description":"Design patterns are typical solutions to commonly occurring problems in software design. They represent best practices used by experienced","breadcrumb":{"@id":"https:\/\/www.w3computing.com\/articles\/how-to-implement-design-patterns-in-cpp\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.w3computing.com\/articles\/how-to-implement-design-patterns-in-cpp\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.w3computing.com\/articles\/how-to-implement-design-patterns-in-cpp\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Articles Home","item":"https:\/\/www.w3computing.com\/articles\/"},{"@type":"ListItem","position":2,"name":"Programming Languages","item":"https:\/\/www.w3computing.com\/articles\/programming-languages\/"},{"@type":"ListItem","position":3,"name":"How to Implement Design Patterns in C++"}]},{"@type":"WebSite","@id":"https:\/\/www.w3computing.com\/articles\/#website","url":"https:\/\/www.w3computing.com\/articles\/","name":"Developer Articles Hub","description":"","alternateName":"Developer Articles","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.w3computing.com\/articles\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561","name":"w3compadmin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","url":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","contentUrl":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","caption":"w3compadmin"},"sameAs":["http:\/\/w3computing.com\/articles"]}]}},"featured_image_src":null,"featured_image_src_square":null,"author_info":{"display_name":"w3compadmin","author_link":"https:\/\/www.w3computing.com\/articles\/author\/w3compadmin\/"},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1961","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/comments?post=1961"}],"version-history":[{"count":2,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1961\/revisions"}],"predecessor-version":[{"id":1974,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1961\/revisions\/1974"}],"wp:attachment":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/media?parent=1961"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/categories?post=1961"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/tags?post=1961"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}