This article describes the process of optimizing the behavior of objects according to strategy pattern
First we have class Gau with only one method hien_thi to show the shapes of the bears
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">class</span> <span class="token class-name">Gau</span> <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">hien_thi</span></span> p <span class="token string">"Hiển thị"</span> <span class="token keyword">end</span> <span class="token keyword">end</span> gau_truc <span class="token operator">=</span> <span class="token constant">Gau</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> gau_truc <span class="token punctuation">.</span> hien_thi gau_do_choi <span class="token operator">=</span> <span class="token constant">Gau</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> gau_do_choi <span class="token punctuation">.</span> hien_thi |
Due to problem requirements, we add the “go” action to the bears.
Way 1
1 2 3 4 5 6 7 8 9 10 | <span class="token keyword">class</span> <span class="token class-name">Gau</span> <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">di</span></span> p <span class="token string">"đi"</span> <span class="token keyword">end</span> <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">hien_thi</span></span> p <span class="token string">"Hiển thị"</span> <span class="token keyword">end</span> <span class="token keyword">end</span> |
But because not all bears are the same, we have to override the subclass
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 | <span class="token keyword">class</span> <span class="token class-name">GauTruc</span> <span class="token operator"><</span> <span class="token constant">Gau</span> <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">di</span></span> p <span class="token string">"đi bằng chân"</span> <span class="token keyword">end</span> <span class="token keyword">end</span> <span class="token keyword">class</span> <span class="token class-name">GauDoChoi</span> <span class="token operator"><</span> <span class="token constant">Gau</span> <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">di</span></span> p <span class="token string">"đi bằng động cơ"</span> <span class="token keyword">end</span> <span class="token keyword">end</span> <span class="token comment"># ...vân vân và mây mây</span> <span class="token keyword">class</span> <span class="token class-name">GauBong</span> <span class="token operator"><</span> <span class="token constant">Gau</span> <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">di</span></span> p <span class="token string">"Không đi được"</span> <span class="token keyword">end</span> <span class="token keyword">end</span> gau_truc <span class="token operator">=</span> <span class="token constant">GauTruc</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> gau_truc <span class="token punctuation">.</span> di gau_do_choi <span class="token operator">=</span> <span class="token constant">GauDoChoi</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> gau_do_choi <span class="token punctuation">.</span> di gau_bong <span class="token operator">=</span> <span class="token constant">GauBong</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> gau_bong <span class="token punctuation">.</span> di |
=> The supclass inherited from the superclass “Gau” causes complications, difficult to maintain and expand later
Method 2
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 37 38 39 40 41 42 43 44 45 46 47 48 49 | <span class="token keyword">class</span> <span class="token class-name">Gau</span> <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">di</span></span> p <span class="token string">"đi"</span> <span class="token keyword">end</span> <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">hien_thi</span></span> p <span class="token string">"Hiển thị"</span> <span class="token keyword">end</span> <span class="token keyword">end</span> <span class="token keyword">module</span> <span class="token constant">DiBangChan</span> <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">di</span></span> p <span class="token string">"đi bằng chân"</span> <span class="token keyword">end</span> <span class="token keyword">end</span> <span class="token keyword">module</span> <span class="token constant">DiBangDongCo</span> <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">di</span></span> p <span class="token string">"đi bằng động cơ"</span> <span class="token keyword">end</span> <span class="token keyword">end</span> <span class="token keyword">module</span> <span class="token constant">KhongDiDuoc</span> <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">di</span></span> p <span class="token string">"Không đi được"</span> <span class="token keyword">end</span> <span class="token keyword">end</span> <span class="token keyword">class</span> <span class="token class-name">GauTruc</span> <span class="token operator"><</span> <span class="token constant">Gau</span> <span class="token keyword">include</span> <span class="token constant">DiBangChan</span> <span class="token keyword">end</span> <span class="token keyword">class</span> <span class="token class-name">GauDoChoi</span> <span class="token operator"><</span> <span class="token constant">Gau</span> <span class="token keyword">include</span> <span class="token constant">DiBangDongCo</span> <span class="token keyword">end</span> <span class="token keyword">class</span> <span class="token class-name">GauBong</span> <span class="token operator"><</span> <span class="token constant">Gau</span> <span class="token keyword">include</span> <span class="token constant">KhongDiDuoc</span> <span class="token keyword">end</span> gau_truc <span class="token operator">=</span> <span class="token constant">GauTruc</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> gau_truc <span class="token punctuation">.</span> di gau_do_choi <span class="token operator">=</span> <span class="token constant">GauDoChoi</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> gau_do_choi <span class="token punctuation">.</span> di gau_bong <span class="token operator">=</span> <span class="token constant">GauBong</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> gau_bong <span class="token punctuation">.</span> di |
=> Although the transforms are separated into independent modules, the expansion is still complicated due to having to create subclasses inherited from the superclass.
Method 3
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 37 38 39 40 41 42 43 | <span class="token keyword">class</span> <span class="token class-name">Gau</span> <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">initialize</span></span> loai_gau <span class="token variable">@gau</span> <span class="token operator">=</span> loai_gau <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token keyword">end</span> <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">di</span></span> <span class="token variable">@gau</span> <span class="token punctuation">.</span> di <span class="token keyword">end</span> <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">hien_thi</span></span> p <span class="token string">"Hiển thị"</span> <span class="token keyword">end</span> <span class="token keyword">end</span> <span class="token keyword">module</span> <span class="token constant">Loai</span> <span class="token keyword">class</span> <span class="token class-name">GauTruc</span> <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">di</span></span> p <span class="token string">"đi bằng chân"</span> <span class="token keyword">end</span> <span class="token keyword">end</span> <span class="token keyword">class</span> <span class="token class-name">GauDoChoi</span> <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">di</span></span> p <span class="token string">"đi bằng động cơ"</span> <span class="token keyword">end</span> <span class="token keyword">end</span> <span class="token keyword">class</span> <span class="token class-name">GauBong</span> <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">di</span></span> p <span class="token string">"Không đi được"</span> <span class="token keyword">end</span> <span class="token keyword">end</span> <span class="token keyword">end</span> gau_truc <span class="token operator">=</span> <span class="token constant">Gau</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token constant">Loai</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">GauTruc</span> gau_truc <span class="token punctuation">.</span> di gau_do_choi <span class="token operator">=</span> <span class="token constant">Gau</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token constant">Loai</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">GauDoChoi</span> gau_do_choi <span class="token punctuation">.</span> di gau_bong <span class="token operator">=</span> <span class="token constant">Gau</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token constant">Loai</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">GauBong</span> gau_bong <span class="token punctuation">.</span> di |
=> Here we see no longer inheritance between classes anymore and the creation of an object is clearer. If you want to expand just add the necessary classes in the module “Type”. Maintenance and expansion become very easy.