JavaScript設計模式之策略模式詳解,javascript設計模式

來源:互聯網
上載者:User

JavaScript設計模式之策略模式詳解,javascript設計模式

在程式設計中,我們也常常遇到這種情況,要實現某一個功能我們有很多種演算法可以實現。

這些演算法靈活多樣,而且可以隨意互相替換。這種解決方案就是所謂的策略模式。

策略模式的定義是:定義一系列的演算法,把它們一個個封裝起來,並且使它們可以相互替換。

/* * pre:策略模式 * 樣本:公司計算獎金,分A、B、C 三種績效,計算方式如下 * 績效為A,獎金乘以係數5 * 績效為B,獎金乘以係數4 * 績效為C,獎金乘以係數3 *///-------- 樣本1 ----------var calculateBonus = function(performanceLevel, salary) { if(performanceLevel === 'A') {  return salary * 5; } if(performanceLevel === 'B') {  return salary * 4; } if(performanceLevel === 'C') {  return salary * 3; }};console.log(calculateBonus('A', 2000));/* 缺點:1、函數體系龐大,擁有太多的if-else語句;  2、如果增加績效D,需修改內建函式,違背封閉-開放原則;  3、複用性差,其他地方如果用到計算獎金,只能賦值黏貼; *///--------- 樣本2 ------------var performanceA = function(salary) { return salary * 5;};var performanceB = function(salary) { return salary * 4;};var performanceC = function(salary) { return salary * 3;};var calculateBonus = function(performanceLevel, salary) { if(performanceLevel === 'A') {  return performanceA(salary); } if(performanceLevel === 'B') {  return performanceB(salary); } if(performanceLevel === 'C') {  return performanceC(salary); }};console.log(calculateBonus('A', 2000)); /* 缺點:1、函數體系龐大,系統變化時缺乏彈性 *///--------- 樣本3 ------------// 策略模式重構:定義一系列演算法,將它們一個個封裝起來。var performanceA = function(){};performanceA.prototype.caculate = function(salary){ return salary * 5;};var performanceB = function(){};performanceB.prototype.caculate = function(salary){ return salary * 4;};var performanceC = function(){};performanceC.prototype.caculate = function(salary){ return salary * 3;};var Bonus = function(){ this.salary = null; this.strategy = null;};Bonus.prototype.setSalary = function(salary){ this.salary = salary;};Bonus.prototype.setStrategy = function(strategy){ this.strategy = strategy;}Bonus.prototype.getBonus = function(){ return this.strategy.caculate(this.salary);}var bonus = new Bonus();bonus.setSalary(2000);bonus.setStrategy(new performanceA());console.log(bonus.getBonus());// ----------- 樣本4 ---------------// javaScript版本var Strategies = { "A":function(salary){  return salary * 5; }, "B":function(salary){  return salary * 4; }, "C":function(salary){  return salary * 3; } };var caculateBonus = function(level,salary){ return Strategies[level](salary);};console.log(caculateBonus("A",2000));

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.