1. What is Delegate Pattern?
The Delegate Design Pattern removes decisions and complex functionality from the core object by distributing or delegating them to other objects. The Delegate Design Pattern removes complex decisions and functions from core objects by delegating them to other objects.
Delegate is a Design Pattern not included in the patterns given by the Gang of Four but it is also used quite a lot. Delegate Pattern works relatively similar to inheritance in object-oriented programming . However, between Delegate and inheritance there are some differences:
- Inheriting a complete copy of a class and delegate only partially copies the class’s features.
- Delegate is often used to copy features of multiple classes.
Let’s take a look at a very real example of Delegate, to transport goods we can transport by passenger car, train and plane, each transporting a different kind of cargo, light and necessary goods. urgently transport by air, bulky goods and need fast transport by passenger car, goods can be transported slowly by train. So you have 3 classes: RailShipper, BusShipper and PlaneShipper, all three classes have a delivery method, with normal handling we need to go through conditional options to choose the type of transportation. . You will authorize a ShipperHandler class, which will help you call the delivery methods of the RailShipper, BusShipper and PlaneShipper classes without knowing the classes. That is, ShipperHandler class has copied methods from 3 classes.
2. Delegate Pattern UML
3. Delegate Pattern application example
In this example, we look at a digital music management application, the songs are saved with the path and the title, we have two types of playlists: M3U and PLS. The Playlist class can provide and manage playlists.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">class</span> <span class="token class-name">Playlist</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token variable">$__songs</span> <span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">__songs</span> <span class="token operator">=</span> <span class="token keyword">array</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">addSong</span> <span class="token punctuation">(</span> <span class="token variable">$location</span> <span class="token punctuation">,</span> <span class="token variable">$title</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$song</span> <span class="token operator">=</span> <span class="token keyword">array</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'location'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token variable">$location</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'title'</span> <span class="token operator">=</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 variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">__songs</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$song</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">getM3U</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$m3u</span> <span class="token operator">=</span> <span class="token single-quoted-string string">'#EXTM3Unn'</span> <span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">__songs</span> <span class="token keyword">as</span> <span class="token variable">$song</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$m3u</span> <span class="token punctuation">.</span> <span class="token operator">=</span> <span class="token single-quoted-string string">'#EXTINF:-1,{$song['</span> title <span class="token single-quoted-string string">']}n'</span> <span class="token punctuation">;</span> <span class="token variable">$m3u</span> <span class="token punctuation">.</span> <span class="token operator">=</span> <span class="token single-quoted-string string">'{$song['</span> location <span class="token single-quoted-string string">']}n'</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token variable">$m3u</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">getPLS</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$pls</span> <span class="token operator">=</span> <span class="token double-quoted-string string">"[playIist]nNumberOfEntries="</span> <span class="token punctuation">.</span> <span class="token function">count</span> <span class="token punctuation">(</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">__songs</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token double-quoted-string string">"nn"</span> <span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">__songs</span> <span class="token keyword">as</span> <span class="token variable">$songCount</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token variable">$song</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$counter</span> <span class="token operator">=</span> <span class="token variable">$songCount</span> <span class="token operator">+</span> <span class="token number">1</span> <span class="token punctuation">;</span> <span class="token variable">$pls</span> <span class="token punctuation">.</span> <span class="token operator">=</span> <span class="token double-quoted-string string">"File <span class="token interpolation"><span class="token punctuation">{</span> <span class="token variable">$counter</span> <span class="token punctuation">}</span></span> = <span class="token interpolation"><span class="token punctuation">{</span> <span class="token variable">$song</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'location'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span></span> n"</span> <span class="token punctuation">;</span> <span class="token variable">$pls</span> <span class="token punctuation">.</span> <span class="token operator">=</span> <span class="token double-quoted-string string">"Title <span class="token interpolation"><span class="token punctuation">{</span> <span class="token variable">$counter</span> <span class="token punctuation">}</span></span> = <span class="token interpolation"><span class="token punctuation">{</span> <span class="token variable">$song</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'title'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span></span> n"</span> <span class="token punctuation">;</span> <span class="token variable">$pls</span> <span class="token punctuation">.</span> <span class="token operator">=</span> <span class="token double-quoted-string string">"Length <span class="token interpolation"><span class="token punctuation">{</span> <span class="token variable">$counter</span> <span class="token punctuation">}</span></span> =-1nn"</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token variable">$pls</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span> |
The Playlist class contains an array of songs, the addSong () method to add songs to the playlist with two parameters, the MP3 file path and the song name. Playlist can be provided in both formats M3U and PLS through two methods, respectively getM3U () and getPLS (). The next code snippet creates a Playlist, adds two songs and, depending on the playlist format, retrieves the playlist in the correct format.
1 2 3 4 5 6 7 8 9 10 | <span class="token variable">$playlist</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Playlist</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token variable">$playlist</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">addSong</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'http://allaravel/music/song_1.mp3'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'Song 1'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token variable">$playlist</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">addSong</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'http://allaravel/music/song_2.mp3'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'Song 2'</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 variable">$externalRetrievedType</span> <span class="token operator">==</span> <span class="token single-quoted-string string">'pls'</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$playlistContent</span> <span class="token operator">=</span> <span class="token variable">$playlist</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">getPLS</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 variable">$playlistContent</span> <span class="token operator">=</span> <span class="token variable">$playlist</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">getM3U</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
However, there are many other playlist formats, programmers need to develop applications that get many different types of playlists. A NewPlayList class is implemented using Delegate Pattern.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <span class="token keyword">class</span> <span class="token class-name">newPlaylist</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token variable">$__songs</span> <span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token variable">$__typeObject</span> <span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct</span> <span class="token punctuation">(</span> <span class="token variable">$type</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">__songs</span> <span class="token operator">=</span> <span class="token keyword">array</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token variable">$object</span> <span class="token operator">=</span> <span class="token double-quoted-string string">" <span class="token interpolation"><span class="token punctuation">{</span> <span class="token variable">$type</span> <span class="token punctuation">}</span></span> Playlist"</span> <span class="token punctuation">;</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">__typeObject</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token variable">$object</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">addSong</span> <span class="token punctuation">(</span> <span class="token variable">$location</span> <span class="token punctuation">,</span> <span class="token variable">$title</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$song</span> <span class="token operator">=</span> <span class="token keyword">array</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'location'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token variable">$location</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'title'</span> <span class="token operator">=</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 variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">__songs</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$song</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">getPlaylist</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$playlist</span> <span class="token operator">=</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">__typeObject</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">getPlaylist</span> <span class="token punctuation">(</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">__songs</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$playlist</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
The NewPlaylist class has a constructor with the $ type parameter, so it can create custom objects. The getPlaylist () method will delegate the getPlaylist () method of the dynamic instance. The getM3U () and getPLS () methods will be passed to the authorization object:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <span class="token keyword">class</span> <span class="token class-name">m3uPlaylistDelegate</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">getPlaylist</span> <span class="token punctuation">(</span> <span class="token variable">$songs</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$m3u</span> <span class="token operator">=</span> <span class="token double-quoted-string string">"#EXTM3Unn"</span> <span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span> <span class="token variable">$songs</span> <span class="token keyword">as</span> <span class="token variable">$song</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$m3u</span> <span class="token punctuation">.</span> <span class="token operator">=</span> <span class="token double-quoted-string string">"#EXTINF:-1, <span class="token interpolation"><span class="token punctuation">{</span> <span class="token variable">$song</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'title'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span></span> n"</span> <span class="token punctuation">;</span> <span class="token variable">$m3u</span> <span class="token punctuation">.</span> <span class="token operator">=</span> <span class="token double-quoted-string string">" <span class="token interpolation"><span class="token punctuation">{</span> <span class="token variable">$song</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'location'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span></span> n"</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token variable">$m3u</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">plsPlaylistDelegate</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">getPlaylist</span> <span class="token punctuation">(</span> <span class="token variable">$songs</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$pls</span> <span class="token operator">=</span> <span class="token double-quoted-string string">"[playIist]nNumberOfEntries="</span> <span class="token punctuation">.</span> <span class="token function">count</span> <span class="token punctuation">(</span> <span class="token variable">$songs</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token double-quoted-string string">"nn"</span> <span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span> <span class="token variable">$songs</span> <span class="token keyword">as</span> <span class="token variable">$songCount</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token variable">$song</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$counter</span> <span class="token operator">=</span> <span class="token variable">$songCount</span> <span class="token operator">+</span> <span class="token number">1</span> <span class="token punctuation">;</span> <span class="token variable">$pls</span> <span class="token punctuation">.</span> <span class="token operator">=</span> <span class="token double-quoted-string string">"File <span class="token interpolation"><span class="token punctuation">{</span> <span class="token variable">$counter</span> <span class="token punctuation">}</span></span> = <span class="token interpolation"><span class="token punctuation">{</span> <span class="token variable">$song</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'location'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span></span> n"</span> <span class="token punctuation">;</span> <span class="token variable">$pls</span> <span class="token punctuation">.</span> <span class="token operator">=</span> <span class="token double-quoted-string string">"Title <span class="token interpolation"><span class="token punctuation">{</span> <span class="token variable">$counter</span> <span class="token punctuation">}</span></span> = <span class="token interpolation"><span class="token punctuation">{</span> <span class="token variable">$song</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'title'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span></span> n"</span> <span class="token punctuation">;</span> <span class="token variable">$pls</span> <span class="token punctuation">.</span> <span class="token operator">=</span> <span class="token double-quoted-string string">"Length <span class="token interpolation"><span class="token punctuation">{</span> <span class="token variable">$counter</span> <span class="token punctuation">}</span></span> =-1nn"</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token variable">$pls</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Meanwhile, taking the playlist will not be hard-coded:
1 2 3 4 5 | <span class="token variable">$externalRetrievedType</span> <span class="token operator">=</span> <span class="token single-quoted-string string">'pls'</span> <span class="token punctuation">;</span> <span class="token variable">$playlist</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">newPlaylist</span> <span class="token punctuation">(</span> <span class="token variable">$externalRetrievedType</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token variable">$playlistContent</span> <span class="token operator">=</span> <span class="token variable">$playlist</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">getPlaylist</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
4. Standardize Delegate Pattern
The above examples we have applied Delegate Pattern, but it is difficult to apply simultaneously to other applications. Let’s create a Delegate class that can be applied anywhere:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">class</span> <span class="token class-name">Delegate</span> <span class="token punctuation">{</span> <span class="token keyword">protected</span> <span class="token variable">$_closures</span> <span class="token operator">=</span> <span class="token keyword">array</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">add</span> <span class="token punctuation">(</span> <span class="token variable">$closures</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 function">is_array</span> <span class="token punctuation">(</span> <span class="token variable">$closures</span> <span class="token punctuation">)</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 function">get_class</span> <span class="token punctuation">(</span> <span class="token variable">$closures</span> <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token single-quoted-string string">'Closure'</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">setClosure</span> <span class="token punctuation">(</span> <span class="token variable">$closures</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">foreach</span> <span class="token punctuation">(</span> <span class="token variable">$closures</span> <span class="token keyword">as</span> <span class="token variable">$closure</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">setClosure</span> <span class="token punctuation">(</span> <span class="token variable">$closure</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">else</span> <span class="token punctuation">{</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">setClosure</span> <span class="token punctuation">(</span> <span class="token variable">$closures</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">setClosure</span> <span class="token punctuation">(</span> <span class="token variable">$closure</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 operator">!</span> <span class="token function">in_array</span> <span class="token punctuation">(</span> <span class="token variable">$closure</span> <span class="token punctuation">,</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">_closures</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">_closures</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$closure</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">execute</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">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">_closures</span> <span class="token keyword">as</span> <span class="token variable">$closure</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">call_user_func</span> <span class="token punctuation">(</span> <span class="token variable">$closure</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> |
With the Delegate class above, we can reuse it anywhere.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">require_once</span> <span class="token single-quoted-string string">'Delegate.php'</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> test <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token double-quoted-string string">"testing"</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name">Dog</span> <span class="token punctuation">{</span> <span class="token keyword">protected</span> <span class="token variable">$_name</span> <span class="token operator">=</span> <span class="token single-quoted-string string">'Jonh'</span> <span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> bark <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">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token property">_name</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token variable">$mydog</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Dog</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token variable">$processruns</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Delegate</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token variable">$processruns</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">add</span> <span class="token punctuation">(</span> <span class="token keyword">function</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 double-quoted-string string">"hello"</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">$processruns</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">add</span> <span class="token punctuation">(</span> <span class="token keyword">function</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 double-quoted-string string">"world"</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">$processruns</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">add</span> <span class="token punctuation">(</span> <span class="token keyword">array</span> <span class="token punctuation">(</span> <span class="token variable">$mydog</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'bark'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token variable">$processruns</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">add</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'test'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Hoặc có thể add vào bằng mảng</span> <span class="token comment">// $processruns->add(array(function() { echo "hello"; }, function() { echo "world"; }, array($mydog, 'bark'), 'test'));</span> <span class="token variable">$processruns</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">execute</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> </span> |
5. Conclusion
Delegate Pattern has many similarities with inheritance in object-oriented programming but it is more extended, it also has similarities with Proxy Pattern but each pattern is useful in different situations. Design patterns help you develop applications faster with the experience built into the patterns that will solve many common problems. The use of desgin pattern also needs to be flexible, not applying rigid, rigid to get the best effect.