Một mẫu chiến lược gói gọn các thuật toán (hoặc chiến lược) thay thế cho một tác vụ cụ thể. Điều này cho phép các phương thức được thay thế trong thời gian chạy bằng các phương thức (chiến lược) khác mà khách hàng không hề hay biết. Các chiến lược về cơ bản là các nhóm thuật toán có thể hoán đổi cho nhau.
Sử dụng chiến lược
Nếu bạn muốn kiểm tra hiệu suất của các thuật toán sắp xếp khác nhau trên các mảng số, shellsort, heapsort, bubblesort, quicksort, v.v. Bằng cách áp dụng mẫu chiến lược cho các thuật toán này, chương trình thử nghiệm có thể lặp qua tất cả các thuật toán và sửa đổi chúng trong thời gian chạy để kiểm tra từng thuật toán dựa trên một mảng. Để chiến lược hoạt động, tất cả các chữ ký phương thức phải giống nhau, vì vậy các chương trình máy khách có thể thay đổi chúng mà không nhận thấy.
JavaScript sử dụng rộng rãi mẫu chiến lược như một cơ chế bổ trợ trong việc xây dựng các khung có thể mở rộng. Đây là một cách tiếp cận rất hiệu quả. Kiểm tra Dofactory JS để biết thêm thông tin.
biểu đồ
Các đối tượng tham gia vào mẫu là:
Context
: Trong mã ví dụ,Shipping
:- Duy trì tham chiếu đến đối tượng chiến lược hiện tại.
- Hỗ trợ giao diện cho khách hàng yêu cầu tính toán chiến lược.
- Cho phép khách hàng thay đổi chiến lược.
Strategy
: Trong mã ví dụ,UPS
,USPS
vàFedex
sử dụng giao diện Chiến lược để thực hiện các thuật toán của họ.
ví dụ
Trong ví dụ này, một đơn đặt hàng phải được gửi từ nhà kho đến khách hàng. Bạn sẽ cần phải đánh giá nhiều công ty vận chuyển để xác định mức giá tốt nhất. Điều này hữu ích trong các giỏ hàng khi khách hàng chọn một tùy chọn vận chuyển và chiến lược đã chọn sẽ trả về chi phí vận chuyển ước tính.
Vận chuyển là bối cảnh và ba công ty vận chuyển UPS
, USPS
và Fedex
là chiến lược. Công ty vận chuyển (chiến lược) được thay đổi ba lần, mỗi lần tính toán chi phí vận chuyển. Trong một tình huống trong thế giới thực, phương thức tính toán có thể gọi vào dịch vụ web của nhà cung cấp dịch vụ. Cuối cùng, hiển thị các chi phí khác nhau.
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 50 51 52 53 54 55 56 57 58 59 | <span class="token keyword">var</span> <span class="token function-variable function">Shipping</span> <span class="token operator">=</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">this</span> <span class="token punctuation">.</span> company <span class="token operator">=</span> <span class="token string">""</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token class-name">Shipping</span> <span class="token punctuation">.</span> prototype <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token function-variable function">setStrategy</span> <span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token parameter">company</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> company <span class="token operator">=</span> company <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token function-variable function">calculate</span> <span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token parameter"><span class="token keyword">package</span></span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> company <span class="token punctuation">.</span> <span class="token function">calculate</span> <span class="token punctuation">(</span> <span class="token keyword">package</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 punctuation">;</span> <span class="token keyword">var</span> <span class="token function-variable function">UPS</span> <span class="token operator">=</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">this</span> <span class="token punctuation">.</span> <span class="token function-variable function">calculate</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token parameter"><span class="token keyword">package</span></span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// calculations...</span> <span class="token keyword">return</span> <span class="token string">"$45.95"</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">var</span> <span class="token function-variable function">USPS</span> <span class="token operator">=</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">this</span> <span class="token punctuation">.</span> <span class="token function-variable function">calculate</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token parameter"><span class="token keyword">package</span></span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// calculations...</span> <span class="token keyword">return</span> <span class="token string">"$39.40"</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">var</span> <span class="token function-variable function">Fedex</span> <span class="token operator">=</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">this</span> <span class="token punctuation">.</span> <span class="token function-variable function">calculate</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token parameter"><span class="token keyword">package</span></span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// calculations...</span> <span class="token keyword">return</span> <span class="token string">"$43.20"</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">function</span> <span class="token function">run</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> <span class="token keyword">package</span> <span class="token operator">=</span> <span class="token punctuation">{</span> from <span class="token operator">:</span> <span class="token string">"76712"</span> <span class="token punctuation">,</span> to <span class="token operator">:</span> <span class="token string">"10012"</span> <span class="token punctuation">,</span> weigth <span class="token operator">:</span> <span class="token string">"lkg"</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token comment">// the 3 strategies</span> <span class="token keyword">var</span> ups <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">UPS</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">var</span> usps <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">USPS</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">var</span> fedex <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Fedex</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">var</span> shipping <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Shipping</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> shipping <span class="token punctuation">.</span> <span class="token function">setStrategy</span> <span class="token punctuation">(</span> ups <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"UPS Strategy: "</span> <span class="token operator">+</span> shipping <span class="token punctuation">.</span> <span class="token function">calculate</span> <span class="token punctuation">(</span> <span class="token keyword">package</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> shipping <span class="token punctuation">.</span> <span class="token function">setStrategy</span> <span class="token punctuation">(</span> usps <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"USPS Strategy: "</span> <span class="token operator">+</span> shipping <span class="token punctuation">.</span> <span class="token function">calculate</span> <span class="token punctuation">(</span> <span class="token keyword">package</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> shipping <span class="token punctuation">.</span> <span class="token function">setStrategy</span> <span class="token punctuation">(</span> fedex <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"Fedex Strategy: "</span> <span class="token operator">+</span> shipping <span class="token punctuation">.</span> <span class="token function">calculate</span> <span class="token punctuation">(</span> <span class="token keyword">package</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">run</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Results:</span> <span class="token comment">// UPS Strategy: $45.95</span> <span class="token comment">// USPS Strategy: $39.40</span> <span class="token comment">// Fedex Strategy: $43.20</span> |
cuối cùng
Tôi luôn mắc nợ. Tôi hy vọng bạn thích bài viết này và học được một cái gì đó mới.
Hẹn gặp lại các bạn trong bài viết tiếp theo! Nếu bạn thích bài viết này, hãy nhấn “THÍCH” và đăng ký để ủng hộ tôi. Cảm ơn rất nhiều.