Files
developer-roadmap/guides/design-patterns-for-humans.html

1555 lines
352 KiB
HTML
Raw Permalink Normal View History

2022-02-15 00:11:44 +00:00
<!DOCTYPE html><html><head><meta charSet="UTF-8"/><title>Design Patterns for Humans</title><meta name="description" content="A language agnostic, ultra-simplified explanation to design patterns"/><meta name="author" content="Kamran Ahmed"/><meta name="keywords" content="roadmap,developer roadmaps,developer roadmap,frontend developer,frontend developer roadmap,frontend,frontend roadmap,backend,backend developer,backend developer roadmap,devops,devops roadmap,fullstack developer roadmap,guide to becoming a developer,sre roadmap,sre,operations roadmap,qa roadmap,android roadmap,android developer roadmap,react roadmap,react developer roadmap,dba roadmap,postgresql dba roadmap"/><meta name="viewport" content="width=device-width, user-scalable=yes, initial-scale=1.0, maximum-scale=3.0, minimum-scale=1.0"/><meta http-equiv="Content-Language" content="en"/><meta property="og:title" content="Design Patterns for Humans"/><meta property="og:description" content="A language agnostic, ultra-simplified explanation to design patterns"/><meta property="og:image" content="https://roadmap.sh/brand-square.png"/><meta property="og:url" content="https://roadmap.sh"/><meta property="og:type" content="website"/><meta property="article:publisher" content="https://facebook.com/kamranahmedse"/><meta property="og:site_name" content="roadmap.sh"/><meta property="article:author" content="Kamran Ahmed"/><meta name="twitter:card" content="summary"/><meta name="twitter:site" content="@kamranahmedse"/><meta name="twitter:title" content="Design Patterns for Humans"/><meta name="twitter:description" content="A language agnostic, ultra-simplified explanation to design patterns"/><meta name="twitter:image" content="https://roadmap.sh/brand-square.png"/><meta name="twitter:image:alt" content="roadmap.sh"/><meta name="mobile-web-app-capable" content="yes"/><meta name="apple-mobile-web-app-capable" content="yes"/><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/><link rel="apple-touch-icon" sizes="180x180" href="/manifest/apple-touch-icon.png"/><meta name="msapplication-TileColor" content="#101010"/><meta name="theme-color" content="#848a9a"/><link rel="manifest" href="/manifest/manifest.json"/><link rel="icon" type="image/png" sizes="32x32" href="/manifest/icon32.png"/><link rel="icon" type="image/png" sizes="16x16" href="/manifest/icon16.png"/><link rel="shortcut icon" href="/manifest/favicon.ico" type="image/x-icon"/><link rel="icon" href="/manifest/favicon.ico" type="image/x-icon"/><script async="" src="https://www.googletagmanager.com/gtag/js?id=UA-139582634-1"></script><script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-139582634-1');
2022-06-28 11:05:04 +00:00
</script><meta name="next-head-count" content="34"/><link rel="preload" href="/_next/static/css/9630938f8579f20e.css" as="style"/><link rel="stylesheet" href="/_next/static/css/9630938f8579f20e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-5cd94c89d3acac5f.js"></script><script src="/_next/static/chunks/webpack-378e68e29c265886.js" defer=""></script><script src="/_next/static/chunks/framework-dc33c0b5493501f0.js" defer=""></script><script src="/_next/static/chunks/main-056d531d8af152ad.js" defer=""></script><script src="/_next/static/chunks/pages/_app-981db2c906b1d6be.js" defer=""></script><script src="/_next/static/chunks/680-f2ef73bf59f135ea.js" defer=""></script><script src="/_next/static/chunks/22-14757297dd54265a.js" defer=""></script><script src="/_next/static/chunks/515-79757bf997a2c9cf.js" defer=""></script><script src="/_next/static/chunks/13-b259223214a65539.js" defer=""></script><script src="/_next/static/chunks/pages/guides/%5Bguide%5D-522b73f8763bfcbb.js" defer=""></script><script src="/_next/static/ooSnr_WJpF8nzY9n_DSAx/_buildManifest.js" defer=""></script><script src="/_next/static/ooSnr_WJpF8nzY9n_DSAx/_ssgManifest.js" defer=""></script><script src="/_next/static/ooSnr_WJpF8nzY9n_DSAx/_middlewareManifest.js" defer=""></script><style data-styled="" data-styled-version="5.3.3">.kiIUjN{line-height:27px;font-size:16px;color:black;margin-bottom:18px;}/*!sc*/
2022-02-15 00:11:44 +00:00
data-styled.g1[id="sc-bdvvtL"]{content:"kiIUjN,"}/*!sc*/
.dKUOdJ{position:relative;font-size:32px;line-height:40px;font-weight:700;margin:20px 0 10px !important;}/*!sc*/
.dKUOdJ:hover .sc-gsDKAQ{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/
data-styled.g3[id="sc-dkPtRN"]{content:"dKUOdJ,"}/*!sc*/
.kqfgwy{font-size:30px;}/*!sc*/
data-styled.g4[id="sc-hKwDye"]{content:"kqfgwy,"}/*!sc*/
.jiGIaj{margin:25px -25px 25px -25px !important;padding:20px 25px !important;border-radius:10px;line-height:1.5 !important;}/*!sc*/
.jiGIaj code{background:transparent;}/*!sc*/
data-styled.g9[id="sc-furwcr"]{content:"jiGIaj,"}/*!sc*/
.cuyQdk{padding:16px 20px;position:relative;background:#e8e8e8;border-radius:5px;margin-bottom:18px;}/*!sc*/
.cuyQdk h1,.cuyQdk h2,.cuyQdk h3,.cuyQdk h4,.cuyQdk h5,.cuyQdk h6{margin-top:0;}/*!sc*/
.cuyQdk p + h4{margin-top:15px;}/*!sc*/
.cuyQdk p{margin:0;}/*!sc*/
.cuyQdk p + p{margin-top:10px;}/*!sc*/
data-styled.g10[id="sc-pVTFL"]{content:"cuyQdk,"}/*!sc*/
.bIxQHp{max-width:100%;margin:25px auto;display:block;}/*!sc*/
data-styled.g13[id="sc-iqseJM"]{content:"bIxQHp,"}/*!sc*/
.gJMBjK{font-weight:600;-webkit-text-decoration:underline;text-decoration:underline;}/*!sc*/
data-styled.g14[id="sc-crHmcD"]{content:"gJMBjK,"}/*!sc*/
.gfrORe{margin-left:40px;margin-bottom:18px;}/*!sc*/
.gfrORe ul{margin-top:18px;}/*!sc*/
data-styled.g15[id="sc-egiyK"]{content:"gfrORe,"}/*!sc*/
.xTMXv{margin-bottom:7px;}/*!sc*/
data-styled.g16[id="sc-bqiRlB"]{content:"xTMXv,"}/*!sc*/
</style></head><body><div id="__next" data-reactroot=""><style data-emotion="css-global brzcv3">:host,:root{--chakra-ring-inset:var(--chakra-empty,/*!*/ /*!*/);--chakra-ring-offset-width:0px;--chakra-ring-offset-color:#fff;--chakra-ring-color:rgba(66, 153, 225, 0.6);--chakra-ring-offset-shadow:0 0 #0000;--chakra-ring-shadow:0 0 #0000;--chakra-space-x-reverse:0;--chakra-space-y-reverse:0;--chakra-colors-transparent:transparent;--chakra-colors-current:currentColor;--chakra-colors-black:#000000;--chakra-colors-white:#FFFFFF;--chakra-colors-whiteAlpha-50:rgba(255, 255, 255, 0.04);--chakra-colors-whiteAlpha-100:rgba(255, 255, 255, 0.06);--chakra-colors-whiteAlpha-200:rgba(255, 255, 255, 0.08);--chakra-colors-whiteAlpha-300:rgba(255, 255, 255, 0.16);--chakra-colors-whiteAlpha-400:rgba(255, 255, 255, 0.24);--chakra-colors-whiteAlpha-500:rgba(255, 255, 255, 0.36);--chakra-colors-whiteAlpha-600:rgba(255, 255, 255, 0.48);--chakra-colors-whiteAlpha-700:rgba(255, 255, 255, 0.64);--chakra-colors-whiteAlpha-800:rgba(255, 255, 255, 0.80);--chakra-colors-whiteAlpha-900:rgba(255, 255, 255, 0.92);--chakra-colors-blackAlpha-50:rgba(0, 0, 0, 0.04);--chakra-colors-blackAlpha-100:rgba(0, 0, 0, 0.06);--chakra-colors-blackAlpha-200:rgba(0, 0, 0, 0.08);--chakra-colors-blackAlpha-300:rgba(0, 0, 0, 0.16);--chakra-colors-blackAlpha-400:rgba(0, 0, 0, 0.24);--chakra-colors-blackAlpha-500:rgba(0, 0, 0, 0.36);--chakra-colors-blackAlpha-600:rgba(0, 0, 0, 0.48);--chakra-colors-blackAlpha-700:rgba(0, 0, 0, 0.64);--chakra-colors-blackAlpha-800:rgba(0, 0, 0, 0.80);--chakra-colors-blackAlpha-900:rgba(0, 0, 0, 0.92);--chakra-colors-gray-50:#F7FAFC;--chakra-colors-gray-100:#EDF2F7;--chakra-colors-gray-200:#E2E8F0;--chakra-colors-gray-300:#CBD5E0;--chakra-colors-gray-400:#A0AEC0;--chakra-colors-gray-500:#718096;--chakra-colors-gray-600:#4A5568;--chakra-colors-gray-700:#2D3748;--chakra-colors-gray-800:#1A202C;--chakra-colors-gray-900:#171923;--chakra-colors-red-50:#FFF5F5;--chakra-colors-red-100:#FED7D7;--chakra-colors-red-200:#FEB2B2;--chakra-colors-red-300:#FC8181;--chakra-colors-red-400:#F56565;--chakra-colors-red-500:#E53E3E;--chakra-colors-red-600:#C53030;--chakra-colors-red-700:#9B2C2C;--chakra-colors-red-800:#822727;--chakra-colors-red-900:#63171B;--chakra-colors-orange-50:#FFFAF0;--chakra-colors-orange-100:#FEEBC8;--chakra-colors-orange-200:#FBD38D;--chakra-colors-orange-300:#F6AD55;--chakra-colors-orange-400:#ED8936;--chakra-colors-orange-500:#DD6B20;--chakra-colors-orange-600:#C05621;--chakra-colors-orange-700:#9C4221;--chakra-colors-orange-800:#7B341E;--chakra-colors-orange-900:#652B19;--chakra-colors-yellow-50:#FFFFF0;--chakra-colors-yellow-100:#FEFCBF;--chakra-colors-yellow-200:#FAF089;--chakra-colors-yellow-300:#F6E05E;--chakra-colors-yellow-400:#ECC94B;--chakra-colors-yellow-500:#D69E2E;--chakra-colors-yellow-600:#B7791F;--chakra-colors-yellow-700:#975A16;--chakra-colors-yellow-800:#744210;--chakra-colors-yellow-900:#5F370E;--chakra-colors-green-50:#F0FFF4;--chakra-colors-green-100:#C6F6D5;--chakra-colors-green-200:#9AE6B4;--chakra-colors-green-300:#68D391;--chakra-colors-green-400:#48BB78;--chakra-colors-green-500:#38A169;--chakra-colors-green-600:#2F855A;--chakra-colors-green-700:#276749;--chakra-colors-green-800:#22543D;--chakra-colors-green-900:#1C4532;--chakra-colors-teal-50:#E6FFFA;--chakra-colors-teal-100:#B2F5EA;--chakra-colors-teal-200:#81E6D9;--chakra-colors-teal-300:#4FD1C5;--chakra-colors-teal-400:#38B2AC;--chakra-colors-teal-500:#319795;--chakra-colors-teal-600:#2C7A7B;--chakra-colors-teal-700:#285E61;--chakra-colors-teal-800:#234E52;--chakra-colors-teal-900:#1D4044;--chakra-colors-blue-50:#ebf8ff;--chakra-colors-blue-100:#bee3f8;--chakra-colors-blue-200:#90cdf4;--chakra-colors-blue-300:#63b3ed;--chakra-colors-blue-400:#4299e1;--chakra-colors-blue-500:#3182ce;--chakra-colors-blue-600:#2b6cb0;--chakra-colors-blue-700:#2c5282;--chakra-colors-blue-800:#2a4365;--chakra-colors-blue-900:#1A365D;--chakra-colors-cyan-50:#EDFDFD;--chakra-colors-cyan-100:#C4F1F9;--chakra-colors-cyan-200:#9DECF9;--chakra-colors-cyan-300:#76E4F7;--chakra-colors-
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getWidth</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">float</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getHeight</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">float</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">WoodenDoor</span> <span class="token keyword">implements</span> <span class="token class-name">Door</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$width</span><span class="token punctuation">;</span>
<span class="token keyword">protected</span> <span class="token variable">$height</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token keyword type-hint">float</span> <span class="token variable">$width</span><span class="token punctuation">,</span> <span class="token keyword type-hint">float</span> <span class="token variable">$height</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">width</span> <span class="token operator">=</span> <span class="token variable">$width</span><span class="token punctuation">;</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">height</span> <span class="token operator">=</span> <span class="token variable">$height</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getWidth</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">float</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">width</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getHeight</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">float</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">height</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Then we have our door factory that makes the door and returns it</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">class</span> <span class="token class-name-definition class-name">DoorFactory</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">function</span> <span class="token function-definition function">makeDoor</span><span class="token punctuation">(</span><span class="token variable">$width</span><span class="token punctuation">,</span> <span class="token variable">$height</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token class-name return-type">Door</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">WoodenDoor</span><span class="token punctuation">(</span><span class="token variable">$width</span><span class="token punctuation">,</span> <span class="token variable">$height</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">And then it can be used as</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token comment">// Make me a door of 100x200</span>
<span class="token variable">$door</span> <span class="token operator">=</span> <span class="token scope">DoorFactory<span class="token punctuation">::</span></span><span class="token function">makeDoor</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">echo</span> <span class="token string single-quoted-string">&#x27;Width: &#x27;</span> <span class="token operator">.</span> <span class="token variable">$door</span><span class="token operator">-&gt;</span><span class="token function">getWidth</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">echo</span> <span class="token string single-quoted-string">&#x27;Height: &#x27;</span> <span class="token operator">.</span> <span class="token variable">$door</span><span class="token operator">-&gt;</span><span class="token function">getHeight</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Make me a door of 50x100</span>
<span class="token variable">$door2</span> <span class="token operator">=</span> <span class="token scope">DoorFactory<span class="token punctuation">::</span></span><span class="token function">makeDoor</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p class="sc-bdvvtL kiIUjN"><strong>When to Use?</strong></p><p class="sc-bdvvtL kiIUjN">When creating an object is not just a few assignments and involves some logic, it makes sense to put it in a dedicated factory instead of repeating the same code everywhere.</p><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">🏭 Factory Method</h2><p class="sc-bdvvtL kiIUjN">Real world example</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Consider the case of a hiring manager. It is impossible for one person to interview for each of the positions. Based on the job opening, she has to decide and delegate the interview steps to different people.</p></blockquote><p class="sc-bdvvtL kiIUjN">In plain words</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">It provides a way to delegate the instantiation logic to child classes.</p></blockquote><p class="sc-bdvvtL kiIUjN">Wikipedia says</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">In class-based programming, the factory method pattern is a creational pattern that uses factory methods to deal with the problem of creating objects without having to specify the exact class of the object that will be created. This is done by creating objects by calling a factory method—either specified in an interface and implemented by child classes, or implemented in a base class and optionally overridden by derived classes—rather than by calling a constructor.</p></blockquote><p class="sc-bdvvtL kiIUjN"> <strong>Programmatic Example</strong></p><p class="sc-bdvvtL kiIUjN">Taking our hiring manager example above. First of all we have an interviewer interface and some implementations for it</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">Interviewer</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">askQuestions</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">Developer</span> <span class="token keyword">implements</span> <span class="token class-name">Interviewer</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">askQuestions</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string single-quoted-string">&#x27;Asking about design patterns!&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">CommunityExecutive</span> <span class="token keyword">implements</span> <span class="token class-name">Interviewer</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">askQuestions</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string single-quoted-string">&#x27;Asking about community building&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Now let us create our <code>HiringManager</code></p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">abstract</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">HiringManager</span>
<span class="token punctuation">{</span>
<span class="token comment">// Factory method</span>
<span class="token keyword">abstract</span> <span class="token keyword">protected</span> <span class="token keyword">function</span> <span class="token function-definition function">makeInterviewer</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token class-name return-type">Interviewer</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">takeInterview</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$interviewer</span> <span class="token operator">=</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token function">makeInterviewer</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$interviewer</span><span class="token operator">-&gt;</span><span class="token function">askQuestions</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Now any child can extend it and provide the required interviewer</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">class</span> <span class="token class-name-definition class-name">DevelopmentManager</span> <span class="token keyword">extends</span> <span class="token class-name">HiringManager</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token keyword">function</span> <span class="token function-definition function">makeInterviewer</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token class-name return-type">Interviewer</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Developer</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">MarketingManager</span> <span class="token keyword">extends</span> <span class="token class-name">HiringManager</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token keyword">function</span> <span class="token function-definition function">makeInterviewer</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token class-name return-type">Interviewer</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">CommunityExecutive</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">and then it can be used as</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token variable">$devManager</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">DevelopmentManager</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$devManager</span><span class="token operator">-&gt;</span><span class="token function">takeInterview</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Output: Asking about design patterns</span>
<span class="token variable">$marketingManager</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MarketingManager</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$marketingManager</span><span class="token operator">-&gt;</span><span class="token function">takeInterview</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Output: Asking about community building.</span>
</code></pre><p class="sc-bdvvtL kiIUjN"><strong>When to use?</strong></p><p class="sc-bdvvtL kiIUjN">Useful when there is some generic processing in a class but the required sub-class is dynamically decided at runtime. Or putting it in other words, when the client doesn&#x27;t know what exact sub-class it might need.</p><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">🔨 Abstract Factory</h2><p class="sc-bdvvtL kiIUjN">Real world example</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Extending our door example from Simple Factory. Based on your needs you might get a wooden door from a wooden door shop, iron door from an iron shop or a PVC door from the relevant shop. Plus you might need a guy with different kind of specialities to fit the door, for example a carpenter for wooden door, welder for iron door etc. As you can see there is a dependency between the doors now, wooden door needs carpenter, iron door needs a welder etc.</p></blockquote><p class="sc-bdvvtL kiIUjN">In plain words</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">A factory of factories; a factory that groups the individual but related/dependent factories together without specifying their concrete classes.</p></blockquote><p class="sc-bdvvtL kiIUjN">Wikipedia says</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">The abstract factory pattern provides a way to encapsulate a group of individual factories that have a common theme without specifying their concrete classes</p></blockquote><p class="sc-bdvvtL kiIUjN"><strong>Programmatic Example</strong></p><p class="sc-bdvvtL kiIUjN">Translating the door example above. First of all we have our <code>Door</code> interface and some implementation for it</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">Door</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getDescription</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">WoodenDoor</span> <span class="token keyword">implements</span> <span class="token class-name">Door</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getDescription</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string single-quoted-string">&#x27;I am a wooden door&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">IronDoor</span> <span class="token keyword">implements</span> <span class="token class-name">Door</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getDescription</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string single-quoted-string">&#x27;I am an iron door&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Then we have some fitting experts for each door type</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">DoorFittingExpert</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getDescription</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">Welder</span> <span class="token keyword">implements</span> <span class="token class-name">DoorFittingExpert</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getDescription</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string single-quoted-string">&#x27;I can only fit iron doors&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">Carpenter</span> <span class="token keyword">implements</span> <span class="token class-name">DoorFittingExpert</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getDescription</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string single-quoted-string">&#x27;I can only fit wooden doors&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Now we have our abstract factory that would let us make family of related objects i.e. wooden door factory would create a wooden door and wooden door fitting expert and iron door factory would create an iron door and iron door fitting expert</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">DoorFactory</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">makeDoor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token class-name return-type">Door</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">makeFittingExpert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token class-name return-type">DoorFittingExpert</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// Wooden factory to return carpenter and wooden door</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">WoodenDoorFactory</span> <span class="token keyword">implements</span> <span class="token class-name">DoorFactory</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">makeDoor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token class-name return-type">Door</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">WoodenDoor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">makeFittingExpert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token class-name return-type">DoorFittingExpert</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Carpenter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// Iron door factory to get iron door and the relevant fitting expert</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">IronDoorFactory</span> <span class="token keyword">implements</span> <span class="token class-name">DoorFactory</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">makeDoor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token class-name return-type">Door</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">IronDoor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">makeFittingExpert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token class-name return-type">DoorFittingExpert</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Welder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">And then it can be used as</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token variable">$woodenFactory</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">WoodenDoorFactory</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$door</span> <span class="token operator">=</span> <span class="token variable">$woodenFactory</span><span class="token operator">-&gt;</span><span class="token function">makeDoor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$expert</span> <span class="token operator">=</span> <span class="token variable">$woodenFactory</span><span class="token operator">-&gt;</span><span class="token function">makeFittingExpert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$door</span><span class="token operator">-&gt;</span><span class="token function">getDescription</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Output: I am a wooden door</span>
<span class="token variable">$expert</span><span class="token operator">-&gt;</span><span class="token function">getDescription</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Output: I can only fit wooden doors</span>
<span class="token comment">// Same for Iron Factory</span>
<span class="token variable">$ironFactory</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">IronDoorFactory</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$door</span> <span class="token operator">=</span> <span class="token variable">$ironFactory</span><span class="token operator">-&gt;</span><span class="token function">makeDoor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$expert</span> <span class="token operator">=</span> <span class="token variable">$ironFactory</span><span class="token operator">-&gt;</span><span class="token function">makeFittingExpert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$door</span><span class="token operator">-&gt;</span><span class="token function">getDescription</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Output: I am an iron door</span>
<span class="token variable">$expert</span><span class="token operator">-&gt;</span><span class="token function">getDescription</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Output: I can only fit iron doors</span>
</code></pre><p class="sc-bdvvtL kiIUjN">As you can see the wooden door factory has encapsulated the <code>carpenter</code> and the <code>wooden door</code> also iron door factory has encapsulated the <code>iron door</code> and <code>welder</code>. And thus it had helped us make sure that for each of the created door, we do not get a wrong fitting expert. </p><p class="sc-bdvvtL kiIUjN"><strong>When to use?</strong></p><p class="sc-bdvvtL kiIUjN">When there are interrelated dependencies with not-that-simple creation logic involved</p><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">👷 Builder</h2><p class="sc-bdvvtL kiIUjN">Real world example</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Imagine you are at Hardee&#x27;s and you order a specific deal, lets say, &quot;Big Hardee&quot; and they hand it over to you without <em>any questions</em>; this is the example of simple factory. But there are cases when the creation logic might involve more steps. For example you want a customized Subway deal, you have several options in how your burger is made e.g what bread do you want? what types of sauces would you like? What cheese would you want? etc. In such cases builder pattern comes to the rescue.</p></blockquote><p class="sc-bdvvtL kiIUjN">In plain words</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Allows you to create different flavors of an object while avoiding constructor pollution. Useful when there could be several flavors of an object. Or when there are a lot of steps involved in creation of an object.</p></blockquote><p class="sc-bdvvtL kiIUjN">Wikipedia says</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">The builder pattern is an object creation software design pattern with the intentions of finding a solution to the telescoping constructor anti-pattern.</p></blockquote><p class="sc-bdvvtL kiIUjN">Having said that let me add a bit about what telescoping constructor anti-pattern is. At one point or the other we have all seen a constructor like below:</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$size</span><span class="token punctuation">,</span> <span class="token variable">$cheese</span> <span class="token operator">=</span> <span class="token constant boolean">true</span><span class="token punctuation">,</span> <span class="token variable">$pepperoni</span> <span class="token operator">=</span> <span class="token constant boolean">true</span><span class="token punctuation">,</span> <span class="token variable">$tomato</span> <span class="token operator">=</span> <span class="token constant boolean">false</span><span class="token punctuation">,</span> <span class="token variable">$lettuce</span> <span class="token operator">=</span> <span class="token constant boolean">true</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">As you can see; the number of constructor parameters can quickly get out of hand and it might become difficult to understand the arrangement of parameters. Plus this parameter list could keep on growing if you would want to add more options in future. This is called telescoping constructor anti-pattern.</p><p class="sc-bdvvtL kiIUjN"><strong>Programmatic Example</strong></p><p class="sc-bdvvtL kiIUjN">The sane alternative is to use the builder pattern. First of all we have our burger that we want to make</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Burger</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$size</span><span class="token punctuation">;</span>
<span class="token keyword">protected</span> <span class="token variable">$cheese</span> <span class="token operator">=</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span>
<span class="token keyword">protected</span> <span class="token variable">$pepperoni</span> <span class="token operator">=</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span>
<span class="token keyword">protected</span> <span class="token variable">$lettuce</span> <span class="token operator">=</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span>
<span class="token keyword">protected</span> <span class="token variable">$tomato</span> <span class="token operator">=</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token class-name type-declaration">BurgerBuilder</span> <span class="token variable">$builder</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">size</span> <span class="token operator">=</span> <span class="token variable">$builder</span><span class="token operator">-&gt;</span><span class="token property">size</span><span class="token punctuation">;</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">cheese</span> <span class="token operator">=</span> <span class="token variable">$builder</span><span class="token operator">-&gt;</span><span class="token property">cheese</span><span class="token punctuation">;</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">pepperoni</span> <span class="token operator">=</span> <span class="token variable">$builder</span><span class="token operator">-&gt;</span><span class="token property">pepperoni</span><span class="token punctuation">;</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">lettuce</span> <span class="token operator">=</span> <span class="token variable">$builder</span><span class="token operator">-&gt;</span><span class="token property">lettuce</span><span class="token punctuation">;</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">tomato</span> <span class="token operator">=</span> <span class="token variable">$builder</span><span class="token operator">-&gt;</span><span class="token property">tomato</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">And then we have the builder</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">class</span> <span class="token class-name-definition class-name">BurgerBuilder</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token variable">$size</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token variable">$cheese</span> <span class="token operator">=</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token variable">$pepperoni</span> <span class="token operator">=</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token variable">$lettuce</span> <span class="token operator">=</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token variable">$tomato</span> <span class="token operator">=</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token keyword type-hint">int</span> <span class="token variable">$size</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">size</span> <span class="token operator">=</span> <span class="token variable">$size</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">addPepperoni</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">pepperoni</span> <span class="token operator">=</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">addLettuce</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">lettuce</span> <span class="token operator">=</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">addCheese</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">cheese</span> <span class="token operator">=</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">addTomato</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">tomato</span> <span class="token operator">=</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token class-name return-type">Burger</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Burger</span><span class="token punctuation">(</span><span class="token this">$this</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">And then it can be used as:</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token variable">$burger</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">BurgerBuilder</span><span class="token punctuation">(</span><span class="token number">14</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">addPepperoni</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">addLettuce</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">addTomato</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p class="sc-bdvvtL kiIUjN"><strong>When to use?</strong></p><p class="sc-bdvvtL kiIUjN">When there could be several flavors of an object and to avoid the constructor telescoping. The key difference from the factory pattern is that; factory pattern is to be used when the creation is a one step process while builder pattern is to be used when the creation is a multi step process.</p><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">🐑 Prototype</h2><p class="sc-bdvvtL kiIUjN">Real world example</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Remember dolly? The sheep that was cloned! Lets not get into the details but the key point here is that it is all about cloning</p></blockquote><p class="sc-bdvvtL kiIUjN">In plain words</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Create object based on an existing object through cloning.</p></blockquote><p class="sc-bdvvtL kiIUjN">Wikipedia says</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">The prototype pattern is a creational design pattern in software development. It is used when the type of objects to create is determined by a prototypical instance, which is cloned to produce new objects.</p></blockquote><p class="sc-bdvvtL kiIUjN">In short, it allows you to create a copy of an existing object and modify it to your needs, instead of going through the trouble of creating an object from scratch and setting it up.</p><p class="sc-bdvvtL kiIUjN"><strong>Programmatic Example</strong></p><p class="sc-bdvvtL kiIUjN">In PHP, it can be easily done using <code>clone</code></p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Sheep</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$name</span><span class="token punctuation">;</span>
<span class="token keyword">protected</span> <span class="token variable">$category</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token keyword type-hint">string</span> <span class="token variable">$name</span><span class="token punctuation">,</span> <span class="token keyword type-hint">string</span> <span class="token variable">$category</span> <span class="token operator">=</span> <span class="token string single-quoted-string">&#x27;Mountain Sheep&#x27;</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">name</span> <span class="token operator">=</span> <span class="token variable">$name</span><span class="token punctuation">;</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">category</span> <span class="token operator">=</span> <span class="token variable">$category</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">setName</span><span class="token punctuation">(</span><span class="token keyword type-hint">string</span> <span class="token variable">$name</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">name</span> <span class="token operator">=</span> <span class="token variable">$name</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">name</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">setCategory</span><span class="token punctuation">(</span><span class="token keyword type-hint">string</span> <span class="token variable">$category</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">category</span> <span class="token operator">=</span> <span class="token variable">$category</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getCategory</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">category</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Then it can be cloned like below</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token variable">$original</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Sheep</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;Jolly&#x27;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">echo</span> <span class="token variable">$original</span><span class="token operator">-&gt;</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Jolly</span>
<span class="token keyword">echo</span> <span class="token variable">$original</span><span class="token operator">-&gt;</span><span class="token function">getCategory</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Mountain Sheep</span>
<span class="token comment">// Clone and modify what is required</span>
<span class="token variable">$cloned</span> <span class="token operator">=</span> <span class="token keyword">clone</span> <span class="token variable">$original</span><span class="token punctuation">;</span>
<span class="token variable">$cloned</span><span class="token operator">-&gt;</span><span class="token function">setName</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;Dolly&#x27;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">echo</span> <span class="token variable">$cloned</span><span class="token operator">-&gt;</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Dolly</span>
<span class="token keyword">echo</span> <span class="token variable">$cloned</span><span class="token operator">-&gt;</span><span class="token function">getCategory</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Mountain sheep</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Also you could use the magic method <code>__clone</code> to modify the cloning behavior.</p><p class="sc-bdvvtL kiIUjN"><strong>When to use?</strong></p><p class="sc-bdvvtL kiIUjN">When an object is required that is similar to existing object or when the creation would be expensive as compared to cloning.</p><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">💍 Singleton</h2><p class="sc-bdvvtL kiIUjN">Real world example</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">There can only be one president of a country at a time. The same president has to be brought to action, whenever duty calls. President here is singleton.</p></blockquote><p class="sc-bdvvtL kiIUjN">In plain words</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Ensures that only one object of a particular class is ever created.</p></blockquote><p class="sc-bdvvtL kiIUjN">Wikipedia says</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">In software engineering, the singleton pattern is a software design pattern that restricts the instantiation of a class to one object. This is useful when exactly one object is needed to coordinate actions across the system.</p></blockquote><p class="sc-bdvvtL kiIUjN">Singleton pattern is actually considered an anti-pattern and overuse of it should be avoided. It is not necessarily bad and could have some valid use-cases but should be used with caution because it introduces a global state in your application and change to it in one place could affect in the other areas and it could become pretty difficult to debug. The other bad thing about them is it makes your code tightly coupled plus mocking the singleton could be difficult.</p><p class="sc-bdvvtL kiIUjN"><strong>Programmatic Example</strong></p><p class="sc-bdvvtL kiIUjN">To create a singleton, make the constructor private, disable cloning, disable extension and create a static variable to house the instance</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">final</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">President</span>
<span class="token punctuation">{</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token variable">$instance</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment">// Hide the constructor</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">function</span> <span class="token function-definition function">getInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token class-name return-type">President</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token scope"><span class="token keyword">self</span><span class="token punctuation">::</span></span><span class="token variable">$instance</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token scope"><span class="token keyword">self</span><span class="token punctuation">::</span></span><span class="token variable">$instance</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token keyword">self</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token scope"><span class="token keyword">self</span><span class="token punctuation">::</span></span><span class="token variable">$instance</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">__clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment">// Disable cloning</span>
<span class="token punctuation">}</span>
<span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">__wakeup</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment">// Disable unserialize</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Then in order to use</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token variable">$president1</span> <span class="token operator">=</span> <span class="token scope">President<span class="token punctuation">::</span></span><span class="token function">getInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$president2</span> <span class="token operator">=</span> <span class="token scope">President<span class="token punctuation">::</span></span><span class="token function">getInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">var_dump</span><span class="token punctuation">(</span><span class="token variable">$president1</span> <span class="token operator">===</span> <span class="token variable">$president2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// true</span>
</code></pre><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">Structural Design Patterns</h2><p class="sc-bdvvtL kiIUjN">In plain words</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Structural patterns are mostly concerned with object composition or in other words how the entities can use each other. Or yet another explanation would be, they help in answering &quot;How to build a software component?&quot;</p></blockquote><p class="sc-bdvvtL kiIUjN">Wikipedia says</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">In software engineering, structural design patterns are design patterns that ease the design by identifying a simple way to realize relationships between entities.</p></blockquote><p class="sc-bdvvtL kiIUjN">There are 7 types of structural patterns</p><ul class="sc-egiyK gfrORe"><li class="sc-bqiRlB xTMXv"><a href="#-adapter" target="_self" class="sc-crHmcD gJMBjK">Adapter</a></li><li class="sc-bqiRlB xTMXv"><a href="#-bridge" target="_self" class="sc-crHmcD gJMBjK">Bridge</a></li><li class="sc-bqiRlB xTMXv"><a href="#-composite" target="_self" class="sc-crHmcD gJMBjK">Composite</a></li><li class="sc-bqiRlB xTMXv"><a href="#-decorator" target="_self" class="sc-crHmcD gJMBjK">Decorator</a></li><li class="sc-bqiRlB xTMXv"><a href="#-facade" target="_self" class="sc-crHmcD gJMBjK">Facade</a></li><li class="sc-bqiRlB xTMXv"><a href="#-flyweight" target="_self" class="sc-crHmcD gJMBjK">Flyweight</a></li><li class="sc-bqiRlB xTMXv"><a href="#-proxy" target="_self" class="sc-crHmcD gJMBjK">Proxy</a></li></ul><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">🔌 Adapter</h2><p class="sc-bdvvtL kiIUjN">Real world example</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Consider that you have some pictures in your memory card and you need to transfer them to your computer. In order to transfer them you need some kind of adapter that is compatible with your computer ports so that you can attach memory card to your computer. In this case card reader is an adapter.
Another example would be the famous power adapter; a three legged plug can&#x27;t be connected to a two pronged outlet, it needs to use a power adapter that makes it compatible with the two pronged outlet.
Yet another example would be a translator translating words spoken by one person to another</p></blockquote><p class="sc-bdvvtL kiIUjN">In plain words</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Adapter pattern lets you wrap an otherwise incompatible object in an adapter to make it compatible with another class.</p></blockquote><p class="sc-bdvvtL kiIUjN">Wikipedia says</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">In software engineering, the adapter pattern is a software design pattern that allows the interface of an existing class to be used as another interface. It is often used to make existing classes work with others without modifying their source code.</p></blockquote><p class="sc-bdvvtL kiIUjN"><strong>Programmatic Example</strong></p><p class="sc-bdvvtL kiIUjN">Consider a game where there is a hunter and he hunts lions.</p><p class="sc-bdvvtL kiIUjN">First we have an interface <code>Lion</code> that all types of lions have to implement</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">Lion</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">roar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">AfricanLion</span> <span class="token keyword">implements</span> <span class="token class-name">Lion</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">roar</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">AsianLion</span> <span class="token keyword">implements</span> <span class="token class-name">Lion</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">roar</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">And hunter expects any implementation of <code>Lion</code> interface to hunt.</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Hunter</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">hunt</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Lion</span> <span class="token variable">$lion</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$lion</span><span class="token operator">-&gt;</span><span class="token function">roar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Now let&#x27;s say we have to add a <code>WildDog</code> in our game so that hunter can hunt that also. But we can&#x27;t do that directly because dog has a different interface. To make it compatible for our hunter, we will have to create an adapter that is compatible</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token comment">// This needs to be added to the game</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">WildDog</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">bark</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// Adapter around wild dog to make it compatible with our game</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">WildDogAdapter</span> <span class="token keyword">implements</span> <span class="token class-name">Lion</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$dog</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token class-name type-declaration">WildDog</span> <span class="token variable">$dog</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">dog</span> <span class="token operator">=</span> <span class="token variable">$dog</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">roar</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">dog</span><span class="token operator">-&gt;</span><span class="token function">bark</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">And now the <code>WildDog</code> can be used in our game using <code>WildDogAdapter</code>.</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token variable">$wildDog</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">WildDog</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$wildDogAdapter</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">WildDogAdapter</span><span class="token punctuation">(</span><span class="token variable">$wildDog</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$hunter</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Hunter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$hunter</span><span class="token operator">-&gt;</span><span class="token function">hunt</span><span class="token punctuation">(</span><span class="token variable">$wildDogAdapter</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">🚡 Bridge</h2><p class="sc-bdvvtL kiIUjN">Real world example</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Consider you have a website with different pages and you are supposed to allow the user to change the theme. What would you do? Create multiple copies of each of the pages for each of the themes or would you just create separate theme and load them based on the user&#x27;s preferences? Bridge pattern allows you to do the second i.e.</p></blockquote><p class="sc-bdvvtL kiIUjN"><img src="https://cloud.githubusercontent.com/assets/11269635/23065293/33b7aea0-f515-11e6-983f-98823c9845ee.png" alt="With and without the bridge pattern" class="sc-iqseJM bIxQHp"/></p><p class="sc-bdvvtL kiIUjN">In Plain Words</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Bridge pattern is about preferring composition over inheritance. Implementation details are pushed from a hierarchy to another object with a separate hierarchy.</p></blockquote><p class="sc-bdvvtL kiIUjN">Wikipedia says</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">The bridge pattern is a design pattern used in software engineering that is meant to &quot;decouple an abstraction from its implementation so that the two can vary independently&quot;</p></blockquote><p class="sc-bdvvtL kiIUjN"><strong>Programmatic Example</strong></p><p class="sc-bdvvtL kiIUjN">Translating our WebPage example from above. Here we have the <code>WebPage</code> hierarchy</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">WebPage</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Theme</span> <span class="token variable">$theme</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getContent</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">About</span> <span class="token keyword">implements</span> <span class="token class-name">WebPage</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$theme</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Theme</span> <span class="token variable">$theme</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">theme</span> <span class="token operator">=</span> <span class="token variable">$theme</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getContent</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token string double-quoted-string">&quot;About page in &quot;</span> <span class="token operator">.</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">theme</span><span class="token operator">-&gt;</span><span class="token function">getColor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">Careers</span> <span class="token keyword">implements</span> <span class="token class-name">WebPage</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$theme</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Theme</span> <span class="token variable">$theme</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">theme</span> <span class="token operator">=</span> <span class="token variable">$theme</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getContent</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token string double-quoted-string">&quot;Careers page in &quot;</span> <span class="token operator">.</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">theme</span><span class="token operator">-&gt;</span><span class="token function">getColor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">And the separate theme hierarchy</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z">
<span class="token keyword">interface</span> <span class="token class-name-definition class-name">Theme</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getColor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">DarkTheme</span> <span class="token keyword">implements</span> <span class="token class-name">Theme</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getColor</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token string single-quoted-string">&#x27;Dark Black&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">LightTheme</span> <span class="token keyword">implements</span> <span class="token class-name">Theme</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getColor</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token string single-quoted-string">&#x27;Off white&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">AquaTheme</span> <span class="token keyword">implements</span> <span class="token class-name">Theme</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getColor</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token string single-quoted-string">&#x27;Light blue&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">And both the hierarchies</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token variable">$darkTheme</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">DarkTheme</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$about</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">About</span><span class="token punctuation">(</span><span class="token variable">$darkTheme</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$careers</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Careers</span><span class="token punctuation">(</span><span class="token variable">$darkTheme</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">echo</span> <span class="token variable">$about</span><span class="token operator">-&gt;</span><span class="token function">getContent</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// &quot;About page in Dark Black&quot;;</span>
<span class="token keyword">echo</span> <span class="token variable">$careers</span><span class="token operator">-&gt;</span><span class="token function">getContent</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// &quot;Careers page in Dark Black&quot;;</span>
</code></pre><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">🌿 Composite</h2><p class="sc-bdvvtL kiIUjN">Real world example</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Every organization is composed of employees. Each of the employees has the same features i.e. has a salary, has some responsibilities, may or may not report to someone, may or may not have some subordinates etc.</p></blockquote><p class="sc-bdvvtL kiIUjN">In plain words</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Composite pattern lets clients treat the individual objects in a uniform manner.</p></blockquote><p class="sc-bdvvtL kiIUjN">Wikipedia says</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">In software engineering, the composite pattern is a partitioning design pattern. The composite pattern describes that a group of objects is to be treated in the same way as a single instance of an object. The intent of a composite is to &quot;compose&quot; objects into tree structures to represent part-whole hierarchies. Implementing the composite pattern lets clients treat individual objects and compositions uniformly.</p></blockquote><p class="sc-bdvvtL kiIUjN"><strong>Programmatic Example</strong></p><p class="sc-bdvvtL kiIUjN">Taking our employees example from above. Here we have different employee types</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">Employee</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token keyword type-hint">string</span> <span class="token variable">$name</span><span class="token punctuation">,</span> <span class="token keyword type-hint">float</span> <span class="token variable">$salary</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">string</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">setSalary</span><span class="token punctuation">(</span><span class="token keyword type-hint">float</span> <span class="token variable">$salary</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getSalary</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">float</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getRoles</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">array</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">Developer</span> <span class="token keyword">implements</span> <span class="token class-name">Employee</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$salary</span><span class="token punctuation">;</span>
<span class="token keyword">protected</span> <span class="token variable">$name</span><span class="token punctuation">;</span>
<span class="token keyword">protected</span> <span class="token variable">$roles</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token keyword type-hint">string</span> <span class="token variable">$name</span><span class="token punctuation">,</span> <span class="token keyword type-hint">float</span> <span class="token variable">$salary</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">name</span> <span class="token operator">=</span> <span class="token variable">$name</span><span class="token punctuation">;</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">salary</span> <span class="token operator">=</span> <span class="token variable">$salary</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">string</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">name</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">setSalary</span><span class="token punctuation">(</span><span class="token keyword type-hint">float</span> <span class="token variable">$salary</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">salary</span> <span class="token operator">=</span> <span class="token variable">$salary</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getSalary</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">float</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">salary</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getRoles</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">array</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">roles</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">Designer</span> <span class="token keyword">implements</span> <span class="token class-name">Employee</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$salary</span><span class="token punctuation">;</span>
<span class="token keyword">protected</span> <span class="token variable">$name</span><span class="token punctuation">;</span>
<span class="token keyword">protected</span> <span class="token variable">$roles</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token keyword type-hint">string</span> <span class="token variable">$name</span><span class="token punctuation">,</span> <span class="token keyword type-hint">float</span> <span class="token variable">$salary</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">name</span> <span class="token operator">=</span> <span class="token variable">$name</span><span class="token punctuation">;</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">salary</span> <span class="token operator">=</span> <span class="token variable">$salary</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">string</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">name</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">setSalary</span><span class="token punctuation">(</span><span class="token keyword type-hint">float</span> <span class="token variable">$salary</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">salary</span> <span class="token operator">=</span> <span class="token variable">$salary</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getSalary</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">float</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">salary</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getRoles</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">array</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">roles</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Then we have an organization which consists of several different types of employees</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Organization</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$employees</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">addEmployee</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Employee</span> <span class="token variable">$employee</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">employees</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$employee</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getNetSalaries</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">float</span>
<span class="token punctuation">{</span>
<span class="token variable">$netSalary</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">employees</span> <span class="token keyword">as</span> <span class="token variable">$employee</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$netSalary</span> <span class="token operator">+=</span> <span class="token variable">$employee</span><span class="token operator">-&gt;</span><span class="token function">getSalary</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token variable">$netSalary</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">And then it can be used as</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token comment">// Prepare the employees</span>
<span class="token variable">$john</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Developer</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;John Doe&#x27;</span><span class="token punctuation">,</span> <span class="token number">12000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$jane</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Designer</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;Jane Doe&#x27;</span><span class="token punctuation">,</span> <span class="token number">15000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Add them to organization</span>
<span class="token variable">$organization</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Organization</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$organization</span><span class="token operator">-&gt;</span><span class="token function">addEmployee</span><span class="token punctuation">(</span><span class="token variable">$john</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$organization</span><span class="token operator">-&gt;</span><span class="token function">addEmployee</span><span class="token punctuation">(</span><span class="token variable">$jane</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">echo</span> <span class="token string double-quoted-string">&quot;Net salaries: &quot;</span> <span class="token operator">.</span> <span class="token variable">$organization</span><span class="token operator">-&gt;</span><span class="token function">getNetSalaries</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Net Salaries: 27000</span>
</code></pre><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">☕ Decorator</h2><p class="sc-bdvvtL kiIUjN">Real world example</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Imagine you run a car service shop offering multiple services. Now how do you calculate the bill to be charged? You pick one service and dynamically keep adding to it the prices for the provided services till you get the final cost. Here each type of service is a decorator.</p></blockquote><p class="sc-bdvvtL kiIUjN">In plain words</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Decorator pattern lets you dynamically change the behavior of an object at run time by wrapping them in an object of a decorator class.</p></blockquote><p class="sc-bdvvtL kiIUjN">Wikipedia says</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">In object-oriented programming, the decorator pattern is a design pattern that allows behavior to be added to an individual object, either statically or dynamically, without affecting the behavior of other objects from the same class. The decorator pattern is often useful for adhering to the Single Responsibility Principle, as it allows functionality to be divided between classes with unique areas of concern.</p></blockquote><p class="sc-bdvvtL kiIUjN"><strong>Programmatic Example</strong></p><p class="sc-bdvvtL kiIUjN">Lets take coffee for example. First of all we have a simple coffee implementing the coffee interface</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">Coffee</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getCost</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getDescription</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">SimpleCoffee</span> <span class="token keyword">implements</span> <span class="token class-name">Coffee</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getCost</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token number">10</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getDescription</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token string single-quoted-string">&#x27;Simple coffee&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">We want to make the code extensible to allow options to modify it if required. Lets make some add-ons (decorators)</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">class</span> <span class="token class-name-definition class-name">MilkCoffee</span> <span class="token keyword">implements</span> <span class="token class-name">Coffee</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$coffee</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Coffee</span> <span class="token variable">$coffee</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">coffee</span> <span class="token operator">=</span> <span class="token variable">$coffee</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getCost</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">coffee</span><span class="token operator">-&gt;</span><span class="token function">getCost</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getDescription</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">coffee</span><span class="token operator">-&gt;</span><span class="token function">getDescription</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">&#x27;, milk&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">WhipCoffee</span> <span class="token keyword">implements</span> <span class="token class-name">Coffee</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$coffee</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Coffee</span> <span class="token variable">$coffee</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">coffee</span> <span class="token operator">=</span> <span class="token variable">$coffee</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getCost</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">coffee</span><span class="token operator">-&gt;</span><span class="token function">getCost</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">5</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getDescription</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">coffee</span><span class="token operator">-&gt;</span><span class="token function">getDescription</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">&#x27;, whip&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">VanillaCoffee</span> <span class="token keyword">implements</span> <span class="token class-name">Coffee</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$coffee</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Coffee</span> <span class="token variable">$coffee</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">coffee</span> <span class="token operator">=</span> <span class="token variable">$coffee</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getCost</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">coffee</span><span class="token operator">-&gt;</span><span class="token function">getCost</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">3</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getDescription</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">coffee</span><span class="token operator">-&gt;</span><span class="token function">getDescription</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">&#x27;, vanilla&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Lets make a coffee now</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token variable">$someCoffee</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">SimpleCoffee</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">echo</span> <span class="token variable">$someCoffee</span><span class="token operator">-&gt;</span><span class="token function">getCost</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 10</span>
<span class="token keyword">echo</span> <span class="token variable">$someCoffee</span><span class="token operator">-&gt;</span><span class="token function">getDescription</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Simple Coffee</span>
<span class="token variable">$someCoffee</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MilkCoffee</span><span class="token punctuation">(</span><span class="token variable">$someCoffee</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">echo</span> <span class="token variable">$someCoffee</span><span class="token operator">-&gt;</span><span class="token function">getCost</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 12</span>
<span class="token keyword">echo</span> <span class="token variable">$someCoffee</span><span class="token operator">-&gt;</span><span class="token function">getDescription</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Simple Coffee, milk</span>
<span class="token variable">$someCoffee</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">WhipCoffee</span><span class="token punctuation">(</span><span class="token variable">$someCoffee</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">echo</span> <span class="token variable">$someCoffee</span><span class="token operator">-&gt;</span><span class="token function">getCost</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 17</span>
<span class="token keyword">echo</span> <span class="token variable">$someCoffee</span><span class="token operator">-&gt;</span><span class="token function">getDescription</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Simple Coffee, milk, whip</span>
<span class="token variable">$someCoffee</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">VanillaCoffee</span><span class="token punctuation">(</span><span class="token variable">$someCoffee</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">echo</span> <span class="token variable">$someCoffee</span><span class="token operator">-&gt;</span><span class="token function">getCost</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 20</span>
<span class="token keyword">echo</span> <span class="token variable">$someCoffee</span><span class="token operator">-&gt;</span><span class="token function">getDescription</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Simple Coffee, milk, whip, vanilla</span>
</code></pre><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">📦 Facade</h2><p class="sc-bdvvtL kiIUjN">Real world example</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">How do you turn on the computer? &quot;Hit the power button&quot; you say! That is what you believe because you are using a simple interface that computer provides on the outside, internally it has to do a lot of stuff to make it happen. This simple interface to the complex subsystem is a facade.</p></blockquote><p class="sc-bdvvtL kiIUjN">In plain words</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Facade pattern provides a simplified interface to a complex subsystem.</p></blockquote><p class="sc-bdvvtL kiIUjN">Wikipedia says</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">A facade is an object that provides a simplified interface to a larger body of code, such as a class library.</p></blockquote><p class="sc-bdvvtL kiIUjN"><strong>Programmatic Example</strong></p><p class="sc-bdvvtL kiIUjN">Taking our computer example from above. Here we have the computer class</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Computer</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getElectricShock</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string double-quoted-string">&quot;Ouch!&quot;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">makeSound</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string double-quoted-string">&quot;Beep beep!&quot;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">showLoadingScreen</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string double-quoted-string">&quot;Loading..&quot;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">bam</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string double-quoted-string">&quot;Ready to be used!&quot;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">closeEverything</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string double-quoted-string">&quot;Bup bup bup buzzzz!&quot;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">sooth</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string double-quoted-string">&quot;Zzzzz&quot;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">pullCurrent</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string double-quoted-string">&quot;Haaah!&quot;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Here we have the facade</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">class</span> <span class="token class-name-definition class-name">ComputerFacade</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$computer</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Computer</span> <span class="token variable">$computer</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">computer</span> <span class="token operator">=</span> <span class="token variable">$computer</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">turnOn</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">computer</span><span class="token operator">-&gt;</span><span class="token function">getElectricShock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">computer</span><span class="token operator">-&gt;</span><span class="token function">makeSound</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">computer</span><span class="token operator">-&gt;</span><span class="token function">showLoadingScreen</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">computer</span><span class="token operator">-&gt;</span><span class="token function">bam</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">turnOff</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">computer</span><span class="token operator">-&gt;</span><span class="token function">closeEverything</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">computer</span><span class="token operator">-&gt;</span><span class="token function">pullCurrent</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">computer</span><span class="token operator">-&gt;</span><span class="token function">sooth</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Now to use the facade</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token variable">$computer</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ComputerFacade</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Computer</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$computer</span><span class="token operator">-&gt;</span><span class="token function">turnOn</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Ouch! Beep beep! Loading.. Ready to be used!</span>
<span class="token variable">$computer</span><span class="token operator">-&gt;</span><span class="token function">turnOff</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Bup bup buzzz! Haah! Zzzzz</span>
</code></pre><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">🍃 Flyweight</h2><p class="sc-bdvvtL kiIUjN">Real world example</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Did you ever have fresh tea from some stall? They often make more than one cup that you demanded and save the rest for any other customer so to save the resources e.g. gas etc. Flyweight pattern is all about that i.e. sharing.</p></blockquote><p class="sc-bdvvtL kiIUjN">In plain words</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">It is used to minimize memory usage or computational expenses by sharing as much as possible with similar objects.</p></blockquote><p class="sc-bdvvtL kiIUjN">Wikipedia says</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">In computer programming, flyweight is a software design pattern. A flyweight is an object that minimizes memory use by sharing as much data as possible with other similar objects; it is a way to use objects in large numbers when a simple repeated representation would use an unacceptable amount of memory.</p></blockquote><p class="sc-bdvvtL kiIUjN"><strong>Programmatic example</strong></p><p class="sc-bdvvtL kiIUjN">Translating our tea example from above. First of all we have tea types and tea maker</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token comment">// Anything that will be cached is flyweight.</span>
<span class="token comment">// Types of tea here will be flyweights.</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">KarakTea</span>
<span class="token punctuation">{</span>
<span class="token punctuation">}</span>
<span class="token comment">// Acts as a factory and saves the tea</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">TeaMaker</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$availableTea</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">make</span><span class="token punctuation">(</span><span class="token variable">$preference</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">availableTea</span><span class="token punctuation">[</span><span class="token variable">$preference</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">availableTea</span><span class="token punctuation">[</span><span class="token variable">$preference</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">KarakTea</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">availableTea</span><span class="token punctuation">[</span><span class="token variable">$preference</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Then we have the <code>TeaShop</code> which takes orders and serves them</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">class</span> <span class="token class-name-definition class-name">TeaShop</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$orders</span><span class="token punctuation">;</span>
<span class="token keyword">protected</span> <span class="token variable">$teaMaker</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token class-name type-declaration">TeaMaker</span> <span class="token variable">$teaMaker</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">teaMaker</span> <span class="token operator">=</span> <span class="token variable">$teaMaker</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">takeOrder</span><span class="token punctuation">(</span><span class="token keyword type-hint">string</span> <span class="token variable">$teaType</span><span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$table</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">orders</span><span class="token punctuation">[</span><span class="token variable">$table</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">teaMaker</span><span class="token operator">-&gt;</span><span class="token function">make</span><span class="token punctuation">(</span><span class="token variable">$teaType</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">serve</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">orders</span> <span class="token keyword">as</span> <span class="token variable">$table</span> <span class="token operator">=&gt;</span> <span class="token variable">$tea</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string double-quoted-string">&quot;Serving tea to table# &quot;</span> <span class="token operator">.</span> <span class="token variable">$table</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">And it can be used as below</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token variable">$teaMaker</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TeaMaker</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$shop</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TeaShop</span><span class="token punctuation">(</span><span class="token variable">$teaMaker</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$shop</span><span class="token operator">-&gt;</span><span class="token function">takeOrder</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;less sugar&#x27;</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$shop</span><span class="token operator">-&gt;</span><span class="token function">takeOrder</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;more milk&#x27;</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$shop</span><span class="token operator">-&gt;</span><span class="token function">takeOrder</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;without sugar&#x27;</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$shop</span><span class="token operator">-&gt;</span><span class="token function">serve</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Serving tea to table# 1</span>
<span class="token comment">// Serving tea to table# 2</span>
<span class="token comment">// Serving tea to table# 5</span>
</code></pre><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">🎱 Proxy</h2><p class="sc-bdvvtL kiIUjN">Real world example</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Have you ever used an access card to go through a door? There are multiple options to open that door i.e. it can be opened either using access card or by pressing a button that bypasses the security. The door&#x27;s main functionality is to open but there is a proxy added on top of it to add some functionality. Let me better explain it using the code example below.</p></blockquote><p class="sc-bdvvtL kiIUjN">In plain words</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Using the proxy pattern, a class represents the functionality of another class.</p></blockquote><p class="sc-bdvvtL kiIUjN">Wikipedia says</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">A proxy, in its most general form, is a class functioning as an interface to something else. A proxy is a wrapper or agent object that is being called by the client to access the real serving object behind the scenes. Use of the proxy can simply be forwarding to the real object, or can provide additional logic. In the proxy extra functionality can be provided, for example caching when operations on the real object are resource intensive, or checking preconditions before operations on the real object are invoked.</p></blockquote><p class="sc-bdvvtL kiIUjN"><strong>Programmatic Example</strong></p><p class="sc-bdvvtL kiIUjN">Taking our security door example from above. Firstly we have the door interface and an implementation of door</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">Door</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">open</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">LabDoor</span> <span class="token keyword">implements</span> <span class="token class-name">Door</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">open</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string double-quoted-string">&quot;Opening lab door&quot;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string double-quoted-string">&quot;Closing the lab door&quot;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Then we have a proxy to secure any doors that we want</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">class</span> <span class="token class-name-definition class-name">SecuredDoor</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$door</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Door</span> <span class="token variable">$door</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">door</span> <span class="token operator">=</span> <span class="token variable">$door</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">open</span><span class="token punctuation">(</span><span class="token variable">$password</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token function">authenticate</span><span class="token punctuation">(</span><span class="token variable">$password</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">door</span><span class="token operator">-&gt;</span><span class="token function">open</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string double-quoted-string">&quot;Big no! It ain&#x27;t possible.&quot;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">authenticate</span><span class="token punctuation">(</span><span class="token variable">$password</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token variable">$password</span> <span class="token operator">===</span> <span class="token string single-quoted-string">&#x27;$ecr@t&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">door</span><span class="token operator">-&gt;</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">And here is how it can be used</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token variable">$door</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">SecuredDoor</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">LabDoor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$door</span><span class="token operator">-&gt;</span><span class="token function">open</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;invalid&#x27;</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Big no! It ain&#x27;t possible.</span>
<span class="token variable">$door</span><span class="token operator">-&gt;</span><span class="token function">open</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;$ecr@t&#x27;</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Opening lab door</span>
<span class="token variable">$door</span><span class="token operator">-&gt;</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Closing lab door</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Yet another example would be some sort of data-mapper implementation. For example, I recently made an ODM (Object Data Mapper) for MongoDB using this pattern where I wrote a proxy around mongo classes while utilizing the magic method <code>__call()</code>. All the method calls were proxied to the original mongo class and result retrieved was returned as it is but in case of <code>find</code> or <code>findOne</code> data was mapped to the required class objects and the object was returned instead of <code>Cursor</code>.</p><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">Behavioral Design Patterns</h2><p class="sc-bdvvtL kiIUjN">In plain words</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">It is concerned with assignment of responsibilities between the objects. What makes them different from structural patterns is they don&#x27;t just specify the structure but also outline the patterns for message passing/communication between them. Or in other words, they assist in answering &quot;How to run a behavior in software component?&quot;</p></blockquote><p class="sc-bdvvtL kiIUjN">Wikipedia says</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">In software engineering, behavioral design patterns are design patterns that identify common communication patterns between objects and realize these patterns. By doing so, these patterns increase flexibility in carrying out this communication.</p></blockquote><p class="sc-bdvvtL kiIUjN">There are 10 types of behavioral design patterns</p><ul class="sc-egiyK gfrORe"><li class="sc-bqiRlB xTMXv"><a href="#-chain-of-responsibility" target="_self" class="sc-crHmcD gJMBjK">Chain of Responsibility</a></li><li class="sc-bqiRlB xTMXv"><a href="#-command" target="_self" class="sc-crHmcD gJMBjK">Command</a></li><li class="sc-bqiRlB xTMXv"><a href="#-iterator" target="_self" class="sc-crHmcD gJMBjK">Iterator</a></li><li class="sc-bqiRlB xTMXv"><a href="#-mediator" target="_self" class="sc-crHmcD gJMBjK">Mediator</a></li><li class="sc-bqiRlB xTMXv"><a href="#-memento" target="_self" class="sc-crHmcD gJMBjK">Memento</a></li><li class="sc-bqiRlB xTMXv"><a href="#-observer" target="_self" class="sc-crHmcD gJMBjK">Observer</a></li><li class="sc-bqiRlB xTMXv"><a href="#-visitor" target="_self" class="sc-crHmcD gJMBjK">Visitor</a></li><li class="sc-bqiRlB xTMXv"><a href="#-strategy" target="_self" class="sc-crHmcD gJMBjK">Strategy</a></li><li class="sc-bqiRlB xTMXv"><a href="#-state" target="_self" class="sc-crHmcD gJMBjK">State</a></li><li class="sc-bqiRlB xTMXv"><a href="#-template-method" target="_self" class="sc-crHmcD gJMBjK">Template Method</a></li></ul><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">🔗 Chain of Responsibility</h2><p class="sc-bdvvtL kiIUjN">Real world example</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">For example, you have three payment methods (<code>A</code>, <code>B</code> and <code>C</code>) setup in your account; each having a different amount in it. <code>A</code> has 100 USD, <code>B</code> has 300 USD and <code>C</code> having 1000 USD and the preference for payments is chosen as <code>A</code> then <code>B</code> then <code>C</code>. You try to purchase something that is worth 210 USD. Using Chain of Responsibility, first of all account <code>A</code> will be checked if it can make the purchase, if yes purchase will be made and the chain will be broken. If not, request will move forward to account <code>B</code> checking for amount if yes chain will be broken otherwise the request will keep forwarding till it finds the suitable handler. Here <code>A</code>, <code>B</code> and <code>C</code> are links of the chain and the whole phenomenon is Chain of Responsibility.</p></blockquote><p class="sc-bdvvtL kiIUjN">In plain words</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">It helps building a chain of objects. Request enters from one end and keeps going from object to object till it finds the suitable handler.</p></blockquote><p class="sc-bdvvtL kiIUjN">Wikip
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$successor</span><span class="token punctuation">;</span>
<span class="token keyword">protected</span> <span class="token variable">$balance</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">setNext</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Account</span> <span class="token variable">$account</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">successor</span> <span class="token operator">=</span> <span class="token variable">$account</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">pay</span><span class="token punctuation">(</span><span class="token keyword type-hint">float</span> <span class="token variable">$amountToPay</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token function">canPay</span><span class="token punctuation">(</span><span class="token variable">$amountToPay</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token function">sprintf</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;Paid %s using %s&#x27;</span> <span class="token operator">.</span> <span class="token constant">PHP_EOL</span><span class="token punctuation">,</span> <span class="token variable">$amountToPay</span><span class="token punctuation">,</span> <span class="token function">get_called_class</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">elseif</span> <span class="token punctuation">(</span><span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">successor</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token function">sprintf</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;Cannot pay using %s. Proceeding ..&#x27;</span> <span class="token operator">.</span> <span class="token constant">PHP_EOL</span><span class="token punctuation">,</span> <span class="token function">get_called_class</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">successor</span><span class="token operator">-&gt;</span><span class="token function">pay</span><span class="token punctuation">(</span><span class="token variable">$amountToPay</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
<span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;None of the accounts have enough balance&#x27;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">canPay</span><span class="token punctuation">(</span><span class="token variable">$amount</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">balance</span> <span class="token operator">&gt;=</span> <span class="token variable">$amount</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">Bank</span> <span class="token keyword">extends</span> <span class="token class-name">Account</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$balance</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token keyword type-hint">float</span> <span class="token variable">$balance</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">balance</span> <span class="token operator">=</span> <span class="token variable">$balance</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">Paypal</span> <span class="token keyword">extends</span> <span class="token class-name">Account</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$balance</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token keyword type-hint">float</span> <span class="token variable">$balance</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">balance</span> <span class="token operator">=</span> <span class="token variable">$balance</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">Bitcoin</span> <span class="token keyword">extends</span> <span class="token class-name">Account</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$balance</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token keyword type-hint">float</span> <span class="token variable">$balance</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">balance</span> <span class="token operator">=</span> <span class="token variable">$balance</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Now let&#x27;s prepare the chain using the links defined above (i.e. Bank, Paypal, Bitcoin)</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token comment">// Let&#x27;s prepare a chain like below</span>
<span class="token comment">// $bank-&gt;$paypal-&gt;$bitcoin</span>
<span class="token comment">//</span>
<span class="token comment">// First priority bank</span>
<span class="token comment">// If bank can&#x27;t pay then paypal</span>
<span class="token comment">// If paypal can&#x27;t pay then bit coin</span>
<span class="token variable">$bank</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Bank</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Bank with balance 100</span>
<span class="token variable">$paypal</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Paypal</span><span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Paypal with balance 200</span>
<span class="token variable">$bitcoin</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Bitcoin</span><span class="token punctuation">(</span><span class="token number">300</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Bitcoin with balance 300</span>
<span class="token variable">$bank</span><span class="token operator">-&gt;</span><span class="token function">setNext</span><span class="token punctuation">(</span><span class="token variable">$paypal</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$paypal</span><span class="token operator">-&gt;</span><span class="token function">setNext</span><span class="token punctuation">(</span><span class="token variable">$bitcoin</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Let&#x27;s try to pay using the first priority i.e. bank</span>
<span class="token variable">$bank</span><span class="token operator">-&gt;</span><span class="token function">pay</span><span class="token punctuation">(</span><span class="token number">259</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Output will be</span>
<span class="token comment">// ==============</span>
<span class="token comment">// Cannot pay using bank. Proceeding ..</span>
<span class="token comment">// Cannot pay using paypal. Proceeding ..:</span>
<span class="token comment">// Paid 259 using Bitcoin!</span>
</code></pre><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">👮 Command</h2><p class="sc-bdvvtL kiIUjN">Real world example</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">A generic example would be you ordering food at a restaurant. You (i.e. <code>Client</code>) ask the waiter (i.e. <code>Invoker</code>) to bring some food (i.e. <code>Command</code>) and waiter simply forwards the request to Chef (i.e. <code>Receiver</code>) who has the knowledge of what and how to cook.
Another example would be you (i.e. <code>Client</code>) switching on (i.e. <code>Command</code>) the television (i.e. <code>Receiver</code>) using a remote control (<code>Invoker</code>).</p></blockquote><p class="sc-bdvvtL kiIUjN">In plain words</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Allows you to encapsulate actions in objects. The key idea behind this pattern is to provide the means to decouple client from receiver.</p></blockquote><p class="sc-bdvvtL kiIUjN">Wikipedia says</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">In object-oriented programming, the command pattern is a behavioral design pattern in which an object is used to encapsulate all information needed to perform an action or trigger an event at a later time. This information includes the method name, the object that owns the method and values for the method parameters.</p></blockquote><p class="sc-bdvvtL kiIUjN"><strong>Programmatic Example</strong></p><p class="sc-bdvvtL kiIUjN">First of all we have the receiver that has the implementation of every action that could be performed</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token comment">// Receiver</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">Bulb</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">turnOn</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string double-quoted-string">&quot;Bulb has been lit&quot;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">turnOff</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string double-quoted-string">&quot;Darkness!&quot;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">then we have an interface that each of the commands are going to implement and then we have a set of commands</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">Command</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">undo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">redo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// Command</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">TurnOn</span> <span class="token keyword">implements</span> <span class="token class-name">Command</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$bulb</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Bulb</span> <span class="token variable">$bulb</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">bulb</span> <span class="token operator">=</span> <span class="token variable">$bulb</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">bulb</span><span class="token operator">-&gt;</span><span class="token function">turnOn</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">undo</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">bulb</span><span class="token operator">-&gt;</span><span class="token function">turnOff</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">redo</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">TurnOff</span> <span class="token keyword">implements</span> <span class="token class-name">Command</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$bulb</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Bulb</span> <span class="token variable">$bulb</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">bulb</span> <span class="token operator">=</span> <span class="token variable">$bulb</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">bulb</span><span class="token operator">-&gt;</span><span class="token function">turnOff</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">undo</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">bulb</span><span class="token operator">-&gt;</span><span class="token function">turnOn</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">redo</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Then we have an <code>Invoker</code> with whom the client will interact to process any commands</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token comment">// Invoker</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">RemoteControl</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">submit</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Command</span> <span class="token variable">$command</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$command</span><span class="token operator">-&gt;</span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Finally let&#x27;s see how we can use it in our client</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token variable">$bulb</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Bulb</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$turnOn</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TurnOn</span><span class="token punctuation">(</span><span class="token variable">$bulb</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$turnOff</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TurnOff</span><span class="token punctuation">(</span><span class="token variable">$bulb</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$remote</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">RemoteControl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$remote</span><span class="token operator">-&gt;</span><span class="token function">submit</span><span class="token punctuation">(</span><span class="token variable">$turnOn</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Bulb has been lit!</span>
<span class="token variable">$remote</span><span class="token operator">-&gt;</span><span class="token function">submit</span><span class="token punctuation">(</span><span class="token variable">$turnOff</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Darkness!</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Command pattern can also be used to implement a transaction based system. Where you keep maintaining the history of commands as soon as you execute them. If the final command is successfully executed, all good otherwise just iterate through the history and keep executing the <code>undo</code> on all the executed commands.</p><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">➿ Iterator</h2><p class="sc-bdvvtL kiIUjN">Real world example</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">An old radio set will be a good example of iterator, where user could start at some channel and then use next or previous buttons to go through the respective channels. Or take an example of MP3 player or a TV set where you could press the next and previous buttons to go through the consecutive channels or in other words they all provide an interface to iterate through the respective channels, songs or radio stations. </p></blockquote><p class="sc-bdvvtL kiIUjN">In plain words</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">It presents a way to access the elements of an object without exposing the underlying presentation.</p></blockquote><p class="sc-bdvvtL kiIUjN">Wikipedia says</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">In object-oriented programming, the iterator pattern is a design pattern in which an iterator is used to traverse a container and access the container&#x27;s elements. The iterator pattern decouples algorithms from containers; in some cases, algorithms are necessarily container-specific and thus cannot be decoupled.</p></blockquote><p class="sc-bdvvtL kiIUjN"><strong>Programmatic example</strong></p><p class="sc-bdvvtL kiIUjN">In PHP it is quite easy to implement using SPL (Standard PHP Library). Translating our radio stations example from above. First of all we have <code>RadioStation</code></p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">class</span> <span class="token class-name-definition class-name">RadioStation</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$frequency</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token keyword type-hint">float</span> <span class="token variable">$frequency</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">frequency</span> <span class="token operator">=</span> <span class="token variable">$frequency</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getFrequency</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">float</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">frequency</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Then we have our iterator</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">use</span> <span class="token package">Countable</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Iterator</span><span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">StationList</span> <span class="token keyword">implements</span> <span class="token class-name">Countable</span><span class="token punctuation">,</span> Iterator
<span class="token punctuation">{</span>
<span class="token doc-comment comment">/** <span class="token keyword">@var</span> <span class="token class-name">RadioStation<span class="token punctuation">[</span><span class="token punctuation">]</span></span> <span class="token parameter">$stations</span> */</span>
<span class="token keyword">protected</span> <span class="token variable">$stations</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token doc-comment comment">/** <span class="token keyword">@var</span> <span class="token class-name"><span class="token keyword">int</span></span> <span class="token parameter">$counter</span> */</span>
<span class="token keyword">protected</span> <span class="token variable">$counter</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">addStation</span><span class="token punctuation">(</span><span class="token class-name type-declaration">RadioStation</span> <span class="token variable">$station</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">stations</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$station</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">removeStation</span><span class="token punctuation">(</span><span class="token class-name type-declaration">RadioStation</span> <span class="token variable">$toRemove</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$toRemoveFrequency</span> <span class="token operator">=</span> <span class="token variable">$toRemove</span><span class="token operator">-&gt;</span><span class="token function">getFrequency</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">stations</span> <span class="token operator">=</span> <span class="token function">array_filter</span><span class="token punctuation">(</span><span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">stations</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token class-name type-declaration">RadioStation</span> <span class="token variable">$station</span><span class="token punctuation">)</span> <span class="token keyword">use</span> <span class="token punctuation">(</span><span class="token variable">$toRemoveFrequency</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token variable">$station</span><span class="token operator">-&gt;</span><span class="token function">getFrequency</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">!==</span> <span class="token variable">$toRemoveFrequency</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">count</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">int</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token function">count</span><span class="token punctuation">(</span><span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">stations</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token class-name return-type">RadioStation</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">stations</span><span class="token punctuation">[</span><span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">counter</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">key</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">counter</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">counter</span><span class="token operator">++</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">rewind</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">counter</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">valid</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">stations</span><span class="token punctuation">[</span><span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">counter</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">And then it can be used as</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token variable">$stationList</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">StationList</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$stationList</span><span class="token operator">-&gt;</span><span class="token function">addStation</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">RadioStation</span><span class="token punctuation">(</span><span class="token number">89</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$stationList</span><span class="token operator">-&gt;</span><span class="token function">addStation</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">RadioStation</span><span class="token punctuation">(</span><span class="token number">101</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$stationList</span><span class="token operator">-&gt;</span><span class="token function">addStation</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">RadioStation</span><span class="token punctuation">(</span><span class="token number">102</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$stationList</span><span class="token operator">-&gt;</span><span class="token function">addStation</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">RadioStation</span><span class="token punctuation">(</span><span class="token number">103.2</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">foreach</span><span class="token punctuation">(</span><span class="token variable">$stationList</span> <span class="token keyword">as</span> <span class="token variable">$station</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token variable">$station</span><span class="token operator">-&gt;</span><span class="token function">getFrequency</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token constant">PHP_EOL</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token variable">$stationList</span><span class="token operator">-&gt;</span><span class="token function">removeStation</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">RadioStation</span><span class="token punctuation">(</span><span class="token number">89</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Will remove station 89</span>
</code></pre><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">👽 Mediator</h2><p class="sc-bdvvtL kiIUjN">Real world example</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">A general example would be when you talk to someone on your mobile phone, there is a network provider sitting between you and them and your conversation goes through it instead of being directly sent. In this case network provider is mediator.</p></blockquote><p class="sc-bdvvtL kiIUjN">In plain words</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Mediator pattern adds a third party object (called mediator) to control the interaction between two objects (called colleagues). It helps reduce the coupling between the classes communicating with each other. Because now they don&#x27;t need to have the knowledge of each other&#x27;s implementation.</p></blockquote><p class="sc-bdvvtL kiIUjN">Wikipedia says</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">In software engineering, the mediator pattern defines an object that encapsulates how a set of objects interact. This pattern is considered to be a behavioral pattern due to the way it can alter the program&#x27;s running behavior.</p></blockquote><p class="sc-bdvvtL kiIUjN"><strong>Programmatic Example</strong></p><p class="sc-bdvvtL kiIUjN">Here is the simplest example of a chat room (i.e. mediator) with users (i.e. colleagues) sending messages to each other.</p><p class="sc-bdvvtL kiIUjN">First of all, we have the mediator i.e. the chat room</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">ChatRoomMediator</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">showMessage</span><span class="token punctuation">(</span><span class="token class-name type-declaration">User</span> <span class="token variable">$user</span><span class="token punctuation">,</span> <span class="token keyword type-hint">string</span> <span class="token variable">$message</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// Mediator</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">ChatRoom</span> <span class="token keyword">implements</span> <span class="token class-name">ChatRoomMediator</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">showMessage</span><span class="token punctuation">(</span><span class="token class-name type-declaration">User</span> <span class="token variable">$user</span><span class="token punctuation">,</span> <span class="token keyword type-hint">string</span> <span class="token variable">$message</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$time</span> <span class="token operator">=</span> <span class="token function">date</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;M d, y H:i&#x27;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$sender</span> <span class="token operator">=</span> <span class="token variable">$user</span><span class="token operator">-&gt;</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">echo</span> <span class="token variable">$time</span> <span class="token operator">.</span> <span class="token string single-quoted-string">&#x27;[&#x27;</span> <span class="token operator">.</span> <span class="token variable">$sender</span> <span class="token operator">.</span> <span class="token string single-quoted-string">&#x27;]:&#x27;</span> <span class="token operator">.</span> <span class="token variable">$message</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Then we have our users i.e. colleagues</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">class</span> <span class="token class-name-definition class-name">User</span> <span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$name</span><span class="token punctuation">;</span>
<span class="token keyword">protected</span> <span class="token variable">$chatMediator</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token keyword type-hint">string</span> <span class="token variable">$name</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">ChatRoomMediator</span> <span class="token variable">$chatMediator</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">name</span> <span class="token operator">=</span> <span class="token variable">$name</span><span class="token punctuation">;</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">chatMediator</span> <span class="token operator">=</span> <span class="token variable">$chatMediator</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">name</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">send</span><span class="token punctuation">(</span><span class="token variable">$message</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">chatMediator</span><span class="token operator">-&gt;</span><span class="token function">showMessage</span><span class="token punctuation">(</span><span class="token this">$this</span><span class="token punctuation">,</span> <span class="token variable">$message</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">And the usage</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token variable">$mediator</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ChatRoom</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$john</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">User</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;John Doe&#x27;</span><span class="token punctuation">,</span> <span class="token variable">$mediator</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$jane</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">User</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;Jane Doe&#x27;</span><span class="token punctuation">,</span> <span class="token variable">$mediator</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$john</span><span class="token operator">-&gt;</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;Hi there!&#x27;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$jane</span><span class="token operator">-&gt;</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;Hey!&#x27;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Output will be</span>
<span class="token comment">// Feb 14, 10:58 [John]: Hi there!</span>
<span class="token comment">// Feb 14, 10:58 [Jane]: Hey!</span>
</code></pre><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">💾 Memento</h2><p class="sc-bdvvtL kiIUjN">Real world example</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Take the example of calculator (i.e. originator), where whenever you perform some calculation the last calculation is saved in memory (i.e. memento) so that you can get back to it and maybe get it restored using some action buttons (i.e. caretaker).</p></blockquote><p class="sc-bdvvtL kiIUjN">In plain words</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Memento pattern is about capturing and storing the current state of an object in a manner that it can be restored later on in a smooth manner.</p></blockquote><p class="sc-bdvvtL kiIUjN">Wikipedia says</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">The memento pattern is a software design pattern that provides the ability to restore an object to its previous state (undo via rollback).</p></blockquote><p class="sc-bdvvtL kiIUjN">Usually useful when you need to provide some sort of undo functionality.</p><p class="sc-bdvvtL kiIUjN"><strong>Programmatic Example</strong></p><p class="sc-bdvvtL kiIUjN">Lets take an example of text editor which keeps saving the state from time to time and that you can restore if you want.</p><p class="sc-bdvvtL kiIUjN">First of all we have our memento object that will be able to hold the editor state</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">class</span> <span class="token class-name-definition class-name">EditorMemento</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$content</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token keyword type-hint">string</span> <span class="token variable">$content</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">content</span> <span class="token operator">=</span> <span class="token variable">$content</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getContent</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">content</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Then we have our editor i.e. originator that is going to use memento object</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Editor</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$content</span> <span class="token operator">=</span> <span class="token string single-quoted-string">&#x27;&#x27;</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">type</span><span class="token punctuation">(</span><span class="token keyword type-hint">string</span> <span class="token variable">$words</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">content</span> <span class="token operator">=</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">content</span> <span class="token operator">.</span> <span class="token string single-quoted-string">&#x27; &#x27;</span> <span class="token operator">.</span> <span class="token variable">$words</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getContent</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">content</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">save</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">EditorMemento</span><span class="token punctuation">(</span><span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">content</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">restore</span><span class="token punctuation">(</span><span class="token class-name type-declaration">EditorMemento</span> <span class="token variable">$memento</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">content</span> <span class="token operator">=</span> <span class="token variable">$memento</span><span class="token operator">-&gt;</span><span class="token function">getContent</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">And then it can be used as</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token variable">$editor</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Editor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Type some stuff</span>
<span class="token variable">$editor</span><span class="token operator">-&gt;</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;This is the first sentence.&#x27;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$editor</span><span class="token operator">-&gt;</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;This is second.&#x27;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Save the state to restore to : This is the first sentence. This is second.</span>
<span class="token variable">$saved</span> <span class="token operator">=</span> <span class="token variable">$editor</span><span class="token operator">-&gt;</span><span class="token function">save</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Type some more</span>
<span class="token variable">$editor</span><span class="token operator">-&gt;</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;And this is third.&#x27;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Output: Content before Saving</span>
<span class="token keyword">echo</span> <span class="token variable">$editor</span><span class="token operator">-&gt;</span><span class="token function">getContent</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// This is the first sentence. This is second. And this is third.</span>
<span class="token comment">// Restoring to last saved state</span>
<span class="token variable">$editor</span><span class="token operator">-&gt;</span><span class="token function">restore</span><span class="token punctuation">(</span><span class="token variable">$saved</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$editor</span><span class="token operator">-&gt;</span><span class="token function">getContent</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// This is the first sentence. This is second.</span>
</code></pre><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">😎 Observer</h2><p class="sc-bdvvtL kiIUjN">Real world example</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">A good example would be the job seekers where they subscribe to some job posting site and they are notified whenever there is a matching job opportunity. </p></blockquote><p class="sc-bdvvtL kiIUjN">In plain words</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Defines a dependency between objects so that whenever an object changes its state, all its dependents are notified.</p></blockquote><p class="sc-bdvvtL kiIUjN">Wikipedia says</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">The observer pattern is a software design pattern in which an object, called the subject, maintains a list of its dependents, called observers, and notifies them automatically of any state changes, usually by calling one of their methods.</p></blockquote><p class="sc-bdvvtL kiIUjN"><strong>Programmatic example</strong></p><p class="sc-bdvvtL kiIUjN">Translating our example from above. First of all we have job seekers that need to be notified for a job posting</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">class</span> <span class="token class-name-definition class-name">JobPost</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$title</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token keyword type-hint">string</span> <span class="token variable">$title</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">title</span> <span class="token operator">=</span> <span class="token variable">$title</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getTitle</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">title</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">JobSeeker</span> <span class="token keyword">implements</span> <span class="token class-name">Observer</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$name</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token keyword type-hint">string</span> <span class="token variable">$name</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">name</span> <span class="token operator">=</span> <span class="token variable">$name</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">onJobPosted</span><span class="token punctuation">(</span><span class="token class-name type-declaration">JobPost</span> <span class="token variable">$job</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment">// Do something with the job posting</span>
<span class="token keyword">echo</span> <span class="token string single-quoted-string">&#x27;Hi &#x27;</span> <span class="token operator">.</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">name</span> <span class="token operator">.</span> <span class="token string single-quoted-string">&#x27;! New job posted: &#x27;</span><span class="token operator">.</span> <span class="token variable">$job</span><span class="token operator">-&gt;</span><span class="token function">getTitle</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Then we have our job postings to which the job seekers will subscribe</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">class</span> <span class="token class-name-definition class-name">EmploymentAgency</span> <span class="token keyword">implements</span> <span class="token class-name">Observable</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$observers</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token keyword">protected</span> <span class="token keyword">function</span> <span class="token function-definition function">notify</span><span class="token punctuation">(</span><span class="token class-name type-declaration">JobPost</span> <span class="token variable">$jobPosting</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">observers</span> <span class="token keyword">as</span> <span class="token variable">$observer</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$observer</span><span class="token operator">-&gt;</span><span class="token function">onJobPosted</span><span class="token punctuation">(</span><span class="token variable">$jobPosting</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">attach</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Observer</span> <span class="token variable">$observer</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">observers</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$observer</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">addJob</span><span class="token punctuation">(</span><span class="token class-name type-declaration">JobPost</span> <span class="token variable">$jobPosting</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token function">notify</span><span class="token punctuation">(</span><span class="token variable">$jobPosting</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Then it can be used as</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token comment">// Create subscribers</span>
<span class="token variable">$johnDoe</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">JobSeeker</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;John Doe&#x27;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$janeDoe</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">JobSeeker</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;Jane Doe&#x27;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Create publisher and attach subscribers</span>
<span class="token variable">$jobPostings</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">EmploymentAgency</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$jobPostings</span><span class="token operator">-&gt;</span><span class="token function">attach</span><span class="token punctuation">(</span><span class="token variable">$johnDoe</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$jobPostings</span><span class="token operator">-&gt;</span><span class="token function">attach</span><span class="token punctuation">(</span><span class="token variable">$janeDoe</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Add a new job and see if subscribers get notified</span>
<span class="token variable">$jobPostings</span><span class="token operator">-&gt;</span><span class="token function">addJob</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">JobPost</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;Software Engineer&#x27;</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Output</span>
<span class="token comment">// Hi John Doe! New job posted: Software Engineer</span>
<span class="token comment">// Hi Jane Doe! New job posted: Software Engineer</span>
</code></pre><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">🏃 Visitor</h2><p class="sc-bdvvtL kiIUjN">Real world example</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Consider someone visiting Dubai. They just need a way (i.e. visa) to enter Dubai. After arrival, they can come and visit any place in Dubai on their own without having to ask for permission or to do some leg work in order to visit any place here; just let them know of a place and they can visit it. Visitor pattern lets you do just that, it helps you add places to visit so that they can visit as much as they can without having to do any legwork.</p></blockquote><p class="sc-bdvvtL kiIUjN">In plain words</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Visitor pattern lets you add further operations to objects without having to modify them.</p></blockquote><p class="sc-bdvvtL kiIUjN">Wikipedia says</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">In object-oriented programming and software engineering, the visitor design pattern is a way of separating an algorithm from an object structure on which it operates. A practical result of this separation is the ability to add new operations to existing object structures without modifying those structures. It is one way to follow the open/closed principle.</p></blockquote><p class="sc-bdvvtL kiIUjN"><strong>Programmatic example</strong></p><p class="sc-bdvvtL kiIUjN">Let&#x27;s take an example of a zoo simulation where we have several different kinds of animals and we have to make them Sound. Let&#x27;s translate this using visitor pattern</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token comment">// Visitee</span>
<span class="token keyword">interface</span> <span class="token class-name-definition class-name">Animal</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">accept</span><span class="token punctuation">(</span><span class="token class-name type-declaration">AnimalOperation</span> <span class="token variable">$operation</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// Visitor</span>
<span class="token keyword">interface</span> <span class="token class-name-definition class-name">AnimalOperation</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">visitMonkey</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Monkey</span> <span class="token variable">$monkey</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">visitLion</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Lion</span> <span class="token variable">$lion</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">visitDolphin</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Dolphin</span> <span class="token variable">$dolphin</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Then we have our implementations for the animals</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Monkey</span> <span class="token keyword">implements</span> <span class="token class-name">Animal</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">shout</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string single-quoted-string">&#x27;Ooh oo aa aa!&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">accept</span><span class="token punctuation">(</span><span class="token class-name type-declaration">AnimalOperation</span> <span class="token variable">$operation</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$operation</span><span class="token operator">-&gt;</span><span class="token function">visitMonkey</span><span class="token punctuation">(</span><span class="token this">$this</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">Lion</span> <span class="token keyword">implements</span> <span class="token class-name">Animal</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">roar</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string single-quoted-string">&#x27;Roaaar!&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">accept</span><span class="token punctuation">(</span><span class="token class-name type-declaration">AnimalOperation</span> <span class="token variable">$operation</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$operation</span><span class="token operator">-&gt;</span><span class="token function">visitLion</span><span class="token punctuation">(</span><span class="token this">$this</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">Dolphin</span> <span class="token keyword">implements</span> <span class="token class-name">Animal</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">speak</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string single-quoted-string">&#x27;Tuut tuttu tuutt!&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">accept</span><span class="token punctuation">(</span><span class="token class-name type-declaration">AnimalOperation</span> <span class="token variable">$operation</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$operation</span><span class="token operator">-&gt;</span><span class="token function">visitDolphin</span><span class="token punctuation">(</span><span class="token this">$this</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Let&#x27;s implement our visitor</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Speak</span> <span class="token keyword">implements</span> <span class="token class-name">AnimalOperation</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">visitMonkey</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Monkey</span> <span class="token variable">$monkey</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$monkey</span><span class="token operator">-&gt;</span><span class="token function">shout</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">visitLion</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Lion</span> <span class="token variable">$lion</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$lion</span><span class="token operator">-&gt;</span><span class="token function">roar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">visitDolphin</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Dolphin</span> <span class="token variable">$dolphin</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$dolphin</span><span class="token operator">-&gt;</span><span class="token function">speak</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">And then it can be used as</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token variable">$monkey</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Monkey</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$lion</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Lion</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$dolphin</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Dolphin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$speak</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Speak</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$monkey</span><span class="token operator">-&gt;</span><span class="token function">accept</span><span class="token punctuation">(</span><span class="token variable">$speak</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Ooh oo aa aa! </span>
<span class="token variable">$lion</span><span class="token operator">-&gt;</span><span class="token function">accept</span><span class="token punctuation">(</span><span class="token variable">$speak</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Roaaar!</span>
<span class="token variable">$dolphin</span><span class="token operator">-&gt;</span><span class="token function">accept</span><span class="token punctuation">(</span><span class="token variable">$speak</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Tuut tutt tuutt!</span>
</code></pre><p class="sc-bdvvtL kiIUjN">We could have done this simply by having an inheritance hierarchy for the animals but then we would have to modify the animals whenever we would have to add new actions to animals. But now we will not have to change them. For example, let&#x27;s say we are asked to add the jump behavior to the animals, we can simply add that by creating a new visitor i.e.</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Jump</span> <span class="token keyword">implements</span> <span class="token class-name">AnimalOperation</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">visitMonkey</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Monkey</span> <span class="token variable">$monkey</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string single-quoted-string">&#x27;Jumped 20 feet high! on to the tree!&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">visitLion</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Lion</span> <span class="token variable">$lion</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string single-quoted-string">&#x27;Jumped 7 feet! Back on the ground!&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">visitDolphin</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Dolphin</span> <span class="token variable">$dolphin</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string single-quoted-string">&#x27;Walked on water a little and disappeared&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">And for the usage</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token variable">$jump</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Jump</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$monkey</span><span class="token operator">-&gt;</span><span class="token function">accept</span><span class="token punctuation">(</span><span class="token variable">$speak</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Ooh oo aa aa!</span>
<span class="token variable">$monkey</span><span class="token operator">-&gt;</span><span class="token function">accept</span><span class="token punctuation">(</span><span class="token variable">$jump</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Jumped 20 feet high! on to the tree!</span>
<span class="token variable">$lion</span><span class="token operator">-&gt;</span><span class="token function">accept</span><span class="token punctuation">(</span><span class="token variable">$speak</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Roaaar!</span>
<span class="token variable">$lion</span><span class="token operator">-&gt;</span><span class="token function">accept</span><span class="token punctuation">(</span><span class="token variable">$jump</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Jumped 7 feet! Back on the ground!</span>
<span class="token variable">$dolphin</span><span class="token operator">-&gt;</span><span class="token function">accept</span><span class="token punctuation">(</span><span class="token variable">$speak</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Tuut tutt tuutt!</span>
<span class="token variable">$dolphin</span><span class="token operator">-&gt;</span><span class="token function">accept</span><span class="token punctuation">(</span><span class="token variable">$jump</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Walked on water a little and disappeared</span>
</code></pre><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">💡 Strategy</h2><p class="sc-bdvvtL kiIUjN">Real world example</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Consider the example of sorting, we implemented bubble sort but the data started to grow and bubble sort started getting very slow. In order to tackle this we implemented Quick sort. But now although the quick sort algorithm was doing better for large datasets, it was very slow for smaller datasets. In order to handle this we implemented a strategy where for small datasets, bubble sort will be used and for larger, quick sort.</p></blockquote><p class="sc-bdvvtL kiIUjN">In plain words</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Strategy pattern allows you to switch the algorithm or strategy based upon the situation.</p></blockquote><p class="sc-bdvvtL kiIUjN">Wikipedia says</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">In computer programming, the strategy pattern (also known as the policy pattern) is a behavioural software design pattern that enables an algorithm&#x27;s behavior to be selected at runtime.</p></blockquote><p class="sc-bdvvtL kiIUjN"><strong>Programmatic example</strong></p><p class="sc-bdvvtL kiIUjN">Translating our example from above. First of all we have our strategy interface and different strategy implementations</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">SortStrategy</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">sort</span><span class="token punctuation">(</span><span class="token keyword type-hint">array</span> <span class="token variable">$dataset</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">array</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">BubbleSortStrategy</span> <span class="token keyword">implements</span> <span class="token class-name">SortStrategy</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">sort</span><span class="token punctuation">(</span><span class="token keyword type-hint">array</span> <span class="token variable">$dataset</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">array</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string double-quoted-string">&quot;Sorting using bubble sort&quot;</span><span class="token punctuation">;</span>
<span class="token comment">// Do sorting</span>
<span class="token keyword">return</span> <span class="token variable">$dataset</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">QuickSortStrategy</span> <span class="token keyword">implements</span> <span class="token class-name">SortStrategy</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">sort</span><span class="token punctuation">(</span><span class="token keyword type-hint">array</span> <span class="token variable">$dataset</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">array</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string double-quoted-string">&quot;Sorting using quick sort&quot;</span><span class="token punctuation">;</span>
<span class="token comment">// Do sorting</span>
<span class="token keyword">return</span> <span class="token variable">$dataset</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">And then we have our client that is going to use any strategy</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Sorter</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$sorter</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token class-name type-declaration">SortStrategy</span> <span class="token variable">$sorter</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">sorter</span> <span class="token operator">=</span> <span class="token variable">$sorter</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">sort</span><span class="token punctuation">(</span><span class="token keyword type-hint">array</span> <span class="token variable">$dataset</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">array</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">sorter</span><span class="token operator">-&gt;</span><span class="token function">sort</span><span class="token punctuation">(</span><span class="token variable">$dataset</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">And it can be used as</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token variable">$dataset</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token variable">$sorter</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Sorter</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">BubbleSortStrategy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$sorter</span><span class="token operator">-&gt;</span><span class="token function">sort</span><span class="token punctuation">(</span><span class="token variable">$dataset</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Output : Sorting using bubble sort</span>
<span class="token variable">$sorter</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Sorter</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">QuickSortStrategy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$sorter</span><span class="token operator">-&gt;</span><span class="token function">sort</span><span class="token punctuation">(</span><span class="token variable">$dataset</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Output : Sorting using quick sort</span>
</code></pre><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">💢 State</h2><p class="sc-bdvvtL kiIUjN">Real world example</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Imagine you are using some drawing application, you choose the paint brush to draw. Now the brush changes its behavior based on the selected color i.e. if you have chosen red color it will draw in red, if blue then it will be in blue etc. </p></blockquote><p class="sc-bdvvtL kiIUjN">In plain words</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">It lets you change the behavior of a class when the state changes.</p></blockquote><p class="sc-bdvvtL kiIUjN">Wikipedia says</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">The state pattern is a behavioral software design pattern that implements a state machine in an object-oriented way. With the state pattern, a state machine is implemented by implementing each individual state as a derived class of the state pattern interface, and implementing state transitions by invoking methods defined by the pattern&#x27;s superclass.
The state pattern can be interpreted as a strategy pattern which is able to switch the current strategy through invocations of methods defined in the pattern&#x27;s interface.</p></blockquote><p class="sc-bdvvtL kiIUjN"><strong>Programmatic example</strong></p><p class="sc-bdvvtL kiIUjN">Let&#x27;s take an example of text editor, it lets you change the state of text that is typed i.e. if you have selected bold, it starts writing in bold, if italic then in italics etc.</p><p class="sc-bdvvtL kiIUjN">First of all we have our state interface and some state implementations</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">WritingState</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">write</span><span class="token punctuation">(</span><span class="token keyword type-hint">string</span> <span class="token variable">$words</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">UpperCase</span> <span class="token keyword">implements</span> <span class="token class-name">WritingState</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">write</span><span class="token punctuation">(</span><span class="token keyword type-hint">string</span> <span class="token variable">$words</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token function">strtoupper</span><span class="token punctuation">(</span><span class="token variable">$words</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">LowerCase</span> <span class="token keyword">implements</span> <span class="token class-name">WritingState</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">write</span><span class="token punctuation">(</span><span class="token keyword type-hint">string</span> <span class="token variable">$words</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token function">strtolower</span><span class="token punctuation">(</span><span class="token variable">$words</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">DefaultText</span> <span class="token keyword">implements</span> <span class="token class-name">WritingState</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">write</span><span class="token punctuation">(</span><span class="token keyword type-hint">string</span> <span class="token variable">$words</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token variable">$words</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Then we have our editor</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">class</span> <span class="token class-name-definition class-name">TextEditor</span>
<span class="token punctuation">{</span>
<span class="token keyword">protected</span> <span class="token variable">$state</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token class-name type-declaration">WritingState</span> <span class="token variable">$state</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">state</span> <span class="token operator">=</span> <span class="token variable">$state</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">setState</span><span class="token punctuation">(</span><span class="token class-name type-declaration">WritingState</span> <span class="token variable">$state</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">state</span> <span class="token operator">=</span> <span class="token variable">$state</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">type</span><span class="token punctuation">(</span><span class="token keyword type-hint">string</span> <span class="token variable">$words</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token property">state</span><span class="token operator">-&gt;</span><span class="token function">write</span><span class="token punctuation">(</span><span class="token variable">$words</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">And then it can be used as</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token variable">$editor</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TextEditor</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">DefaultText</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$editor</span><span class="token operator">-&gt;</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;First line&#x27;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$editor</span><span class="token operator">-&gt;</span><span class="token function">setState</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">UpperCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$editor</span><span class="token operator">-&gt;</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;Second line&#x27;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$editor</span><span class="token operator">-&gt;</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;Third line&#x27;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$editor</span><span class="token operator">-&gt;</span><span class="token function">setState</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">LowerCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$editor</span><span class="token operator">-&gt;</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;Fourth line&#x27;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$editor</span><span class="token operator">-&gt;</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token string single-quoted-string">&#x27;Fifth line&#x27;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Output:</span>
<span class="token comment">// First line</span>
<span class="token comment">// SECOND LINE</span>
<span class="token comment">// THIRD LINE</span>
<span class="token comment">// fourth line</span>
<span class="token comment">// fifth line</span>
</code></pre><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">📒 Template Method</h2><p class="sc-bdvvtL kiIUjN">Real world example</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Suppose we are getting some house built. The steps for building might look like</p><ul class="sc-egiyK gfrORe"><li class="sc-bqiRlB xTMXv">Prepare the base of house</li><li class="sc-bqiRlB xTMXv">Build the walls</li><li class="sc-bqiRlB xTMXv">Add roof</li><li class="sc-bqiRlB xTMXv">Add other floors</li></ul></blockquote><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">The order of these steps could never be changed i.e. you can&#x27;t build the roof before building the walls etc but each of the steps could be modified for example walls can be made of wood or polyester or stone.</p></blockquote><p class="sc-bdvvtL kiIUjN">In plain words</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">Template method defines the skeleton of how a certain algorithm could be performed, but defers the implementation of those steps to the children classes.</p></blockquote><p class="sc-bdvvtL kiIUjN">Wikipedia says</p><blockquote class="sc-pVTFL cuyQdk"><p class="sc-bdvvtL kiIUjN">In software engineering, the template method pattern is a behavioral design pattern that defines the program skeleton of an algorithm in an operation, deferring some steps to subclasses. It lets one redefine certain steps of an algorithm without changing the algorithm&#x27;s structure.</p></blockquote><p class="sc-bdvvtL kiIUjN"><strong>Programmatic Example</strong></p><p class="sc-bdvvtL kiIUjN">Imagine we have a build tool that helps us test, lint, build, generate build reports (i.e. code coverage reports, linting report etc) and deploy our app on the test server.</p><p class="sc-bdvvtL kiIUjN">First of all we have our base class that specifies the skeleton for the build algorithm</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">abstract</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">Builder</span>
<span class="token punctuation">{</span>
<span class="token comment">// Template method</span>
<span class="token keyword">final</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token function">test</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token function">lint</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token function">assemble</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token this">$this</span><span class="token operator">-&gt;</span><span class="token function">deploy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">abstract</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">test</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">abstract</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">lint</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">abstract</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">assemble</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">abstract</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">deploy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">Then we can have our implementations</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token keyword">class</span> <span class="token class-name-definition class-name">AndroidBuilder</span> <span class="token keyword">extends</span> <span class="token class-name">Builder</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">test</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string single-quoted-string">&#x27;Running android tests&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">lint</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string single-quoted-string">&#x27;Linting the android code&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">assemble</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string single-quoted-string">&#x27;Assembling the android build&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">deploy</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string single-quoted-string">&#x27;Deploying android build to server&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">IosBuilder</span> <span class="token keyword">extends</span> <span class="token class-name">Builder</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">test</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string single-quoted-string">&#x27;Running ios tests&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">lint</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string single-quoted-string">&#x27;Linting the ios code&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">assemble</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string single-quoted-string">&#x27;Assembling the ios build&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">deploy</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string single-quoted-string">&#x27;Deploying ios build to server&#x27;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p class="sc-bdvvtL kiIUjN">And then it can be used as</p><pre class="sc-furwcr jiGIaj language-php"><code class="chakra-code language-php css-4m8w8z"><span class="token variable">$androidBuilder</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">AndroidBuilder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$androidBuilder</span><span class="token operator">-&gt;</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Output:</span>
<span class="token comment">// Running android tests</span>
<span class="token comment">// Linting the android code</span>
<span class="token comment">// Assembling the android build</span>
<span class="token comment">// Deploying android build to server</span>
<span class="token variable">$iosBuilder</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">IosBuilder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$iosBuilder</span><span class="token operator">-&gt;</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Output:</span>
<span class="token comment">// Running ios tests</span>
<span class="token comment">// Linting the ios code</span>
<span class="token comment">// Assembling the ios build</span>
<span class="token comment">// Deploying ios build to server</span>
2022-06-28 11:05:04 +00:00
</code></pre><h2 class="sc-dkPtRN sc-hKwDye dKUOdJ kqfgwy">Wrap Up Folks</h2><p class="sc-bdvvtL kiIUjN">And that about wraps it up. I will continue to improve this, so you might want to watch/star this repository to revisit. Also, I have plans on writing the same about the architectural patterns, stay tuned for it.</p><span></span></div></div><style data-emotion="css zeuzl6">.css-zeuzl6{background:var(--chakra-colors-white);border-top-width:1px;padding-top:45px;padding-bottom:60px;text-align:center;}@media screen and (min-width: 30em){.css-zeuzl6{padding-top:45px;padding-bottom:60px;}}@media screen and (min-width: 48em){.css-zeuzl6{padding-top:70px;padding-bottom:90px;}}</style><div class="css-zeuzl6"><div class="chakra-container css-nm5t63"><style data-emotion="css 482acf">.css-482acf{font-family:var(--chakra-fonts-heading);font-weight:var(--chakra-fontWeights-bold);font-size:25px;line-height:1.33;margin-bottom:10px;}@media screen and (min-width: 30em){.css-482acf{font-size:25px;margin-bottom:10px;}}@media screen and (min-width: 48em){.css-482acf{font-size:35px;line-height:1.2;margin-bottom:20px;}}</style><h2 class="chakra-heading css-482acf">Open Source</h2><style data-emotion="css tmji1h">.css-tmji1h{line-height:26px;font-size:15px;margin-bottom:20px;}@media screen and (min-width: 30em){.css-tmji1h{font-size:15px;}}@media screen and (min-width: 48em){.css-tmji1h{font-size:16px;}}</style><p class="chakra-text css-tmji1h">The project is OpenSource, <style data-emotion="css 1om4i6h">.css-1om4i6h{transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-fast);transition-timing-function:var(--chakra-transition-easing-ease-out);cursor:pointer;-webkit-text-decoration:none;text-decoration:none;outline:2px solid transparent;outline-offset:2px;color:inherit;border-bottom-width:1px;font-weight:600;}.css-1om4i6h:hover,.css-1om4i6h[data-hover]{-webkit-text-decoration:none;text-decoration:none;}.css-1om4i6h:focus,.css-1om4i6h[data-focus]{box-shadow:var(--chakra-shadows-outline);}</style><a target="_blank" class="chakra-link css-1om4i6h" href="https://github.com/search?o=desc&amp;q=stars%3A%3E100000&amp;s=stars&amp;type=Repositories">7th most starred project on GitHub</a> and is visited by hundreds of thousands of developers every month.</p><iframe src="https://ghbtns.com/github-btn.html?user=kamranahmedse&amp;repo=developer-roadmap&amp;type=star&amp;count=true&amp;size=large" frameBorder="0" scrolling="0" width="170" height="30" style="margin:auto;margin-bottom:30px" title="GitHub"></iframe><style data-emotion="css mz2q9v">.css-mz2q9v{line-height:25px;font-size:15px;margin-bottom:15px;}@media screen and (min-width: 30em){.css-mz2q9v{line-height:25px;font-size:15px;}}@media screen and (min-width: 48em){.css-mz2q9v{line-height:26px;font-size:16px;}}</style><p class="chakra-text css-mz2q9v">A considerable amount of my time is spent doing unpaid community work on things that I hope will help humanity in some way. Your sponsorship helps me continue to produce more open-source and free educational material consumed by hundreds of thousands of developers every month.</p><div class="css-0"><iframe src="https://ghbtns.com/github-btn.html?user=kamranahmedse&amp;type=sponsor&amp;size=large" frameBorder="0" scrolling="0" width="260" height="30" title="GitHub" style="margin:auto"></iframe></div></div></div><style data-emotion="css llwly4">.css-llwly4{border-top-width:1px;padding-top:40px;padding-bottom:40px;text-align:left;background:var(--chakra-colors-brand-footer);}@media screen and (min-width: 30em){.css-llwly4{padding-top:40px;padding-bottom:45px;}}@media screen and (min-width: 48em){.css-llwly4{padding-top:70px;padding-bottom:80px;}}</style><div class="css-llwly4"><div class="chakra-container css-nm5t63"><style data-emotion="css 1bjthgu">.css-1bjthgu{font-family:var(--chakra-fonts-heading);font-weight:var(--chakra-fontWeights-bold);font-size:25px;line-height:1.33;color:var(--chakra-colors-gray-100);margin-bottom:5px;}@media screen and (min-width: 30em){.css-1bjthgu{font-size:25px;