在程序设计中,我们也常常遇到这种情况,要实现某一个功能我们有很多种算法可以实现。
这些算法灵活多样,而且可以随意互相替换。这种解决方案就是所谓的策略模式。
策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。
/* * 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));
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍Java设计模式之策略模式详解,包括了Java设计模式之策略模式详解的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Java策略模式,供大家参考,具体内容如下 1、策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(PolicyPattern)。 定义如下: Define a family of algorithms,encapsulate
本文向大家介绍详解Python设计模式之策略模式,包括了详解Python设计模式之策略模式的使用技巧和注意事项,需要的朋友参考一下 虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用。《设计模式:可复用面向对象软件的基础》一书中有 23 个模式,其中有 16 个在动态语言中“不见了,或者简化了”。 1、策略模式概述 策略模式:定义一系列算法,把它们一一封装起来,并且使它们之间可
介绍 策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。 正文 在理解策略模式之前,我们先来一个例子,一般情况下,如果我们要做数据合法性验证,很多时候都是按照swith语句来判断,但是这就带来几个问题,首先如果增加需求的话,我们还要再次修改这段代码以增加逻辑,而且在进行单元测试的时候也会越来越复杂,代码如下: validato
本文向大家介绍学习JavaScript设计模式之策略模式,包括了学习JavaScript设计模式之策略模式的使用技巧和注意事项,需要的朋友参考一下 把不变的部分和变化的部分隔开是每个设计模式的主题。 条条大路通罗马。我们经常会遇到解决一件事情有多种方案,比如压缩文件,我们可以使用zip算法、也可以使用gzip算法。其灵活多样,我们可以采用策略模式解决。 一、定义 定义一系列的算法,把它们一个个封装
本文向大家介绍Python设计模式之策略模式实例详解,包括了Python设计模式之策略模式实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python设计模式之策略模式。分享给大家供大家参考,具体如下: 策略模式(Strategy Pattern):它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. 下面是一个商场活动的实现 运行
本文向大家介绍javascript设计模式之策略模式学习笔记,包括了javascript设计模式之策略模式学习笔记的使用技巧和注意事项,需要的朋友参考一下 1. 理解javascript中的策略模式 策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。 使用策略模式的优点如下: 优点: 1. 策略模式利用组合,委托等技术和思想,有效的避免很多if条件语句。