策略模式

策略模式的定義

策略模式的定義是: 定義一系列的算法,把它們一個個封裝起來,而且使它們能夠相互替換算法

一個基於策略模式的程序至少由兩部分組成。第一個部分是一組策略類,策略類封裝了具體 的算法,並負責具體的計算過程。 第二個部分是環境類 Context,Context 接受客戶的請求,隨後 把請求委託給某一個策略類設計模式

策略模式的應用

  1. 計算獎金

需求:績效爲 S 的人年 終獎有 4 倍工資,績效爲 A 的人年終獎有 3 倍工資,而績效爲 B 的人年終獎是 2 倍基於類的實現方式:this

// 定義算法類 var performanceS = function() {}; performanceS.prototype.calculate = function(salary) { return salary * 4; }; var performanceA = function() {}; performanceA.prototype.calculate = function(salary) { return salary * 3; }; var performanceB = function() {}; performanceB.prototype.calculate = function(salary) { return salary * 2; }; // 定義獎金規則類 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.calculate(this.salary); }; var bonus = new Bonus(); bonus.setSalary(10000); bonus.setStrategy(new performanceS()); console.log(bonus.getBonus()); // 輸出:40000 bonus.setStrategy( new performanceA() ); // 從新設置策略對象 console.log(bonus.getBonus()); // 輸出:30000 JavaScript版本: var strategies = { S: function(salary) { return salary * 4; }, A: function(salary) { return salary * 3; }, B: function(salary) { return salary * 2; } }; var calculateBonus = function(salary, level) { return strategies[level](salary); }; console.log(calculateBonus(10000, 'S'));// 40000 console.log(calculateBonus(10000, 'B'));// 20000                                                                                摘自:曾探《JavaScript設計模式與開發實踐》 // 定義算法類 var performanceS = function() {}; performanceS.prototype.calculate = function(salary) { return salary * 4; }; var performanceA = function() {}; performanceA.prototype.calculate = function(salary) { return salary * 3; }; var performanceB = function() {}; performanceB.prototype.calculate = function(salary) { return salary * 2; }; // 定義獎金規則類 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.calculate(this.salary); }; var bonus = new Bonus(); bonus.setSalary(10000); bonus.setStrategy(new performanceS()); console.log(bonus.getBonus()); // 輸出:40000 bonus.setStrategy( new performanceA() ); // 從新設置策略對象 console.log(bonus.getBonus()); // 輸出:30000 JavaScript版本: var strategies = { S: function(salary) { return salary * 4; }, A: function(salary) { return salary * 3; }, B: function(salary) { return salary * 2; } }; var calculateBonus = function(salary, level) { return strategies[level](salary); }; console.log(calculateBonus(10000, 'S'));// 40000 console.log(calculateBonus(10000, 'B'));// 20000                                                                                摘自:曾探《JavaScript設計模式與開發實踐》
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息