乐趣区

关于策略模式:策略模式

定义

策略模式指的是定义一系列算法,把它们一个个封装起来。目标是将 算法的应用与算法的实现 拆散开来。

一个基于策略模式的程序至多由两局部组成。第一个局部是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。第二个局部是环境类 Context,Context 承受客户的申请,随后把申请委托给某一个策略类。要做到这点,阐明 Context 中要维持对某个策略对象的援用。

第一版重构


var performanceS = function() {};


performanceS.prototype.calculate = function(salary) {return salary * 4}

var performaceA = 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);
}

Javascript 版策略模式

var strategies = {"S": function(salary) {return salary * 4;},
    "A": function(salary) {return salary * 3;},
    "B": function(salary) {return salary * 2}
};

var calculateBonus = function(level, salary) {return strategies[level](salary);
}

策略模式的优缺点

长处:

  • 策略模式利用组合、委托和多态等技术和思维,能够无效地防止多重条件抉择语句。
  • 策略模式提供了对凋谢——关闭准则的完满反对,将算法封装在独立里的 strategy 中,使得它们易于切换,易于扩大。
  • 策略模式中的算法也能够复用在零碎的其余中央,从而防止反复的复制粘贴工作
  • 在策略模式中利用组合和委托来让 Context 领有执行算法的能力,这也是继承的一种更轻便的代替计划。

毛病:

  • 违反起码常识准则。

一等函数对象与策略模式

var S = function(salary) {return salary * 4}

var A = function(salary) {return salary * 3} 

var B = function(salary) {return salary * 2}

var calculateBonus = function(func, salary) {return func(salary);
}
退出移动版