【JS设计模式】策略模式的代码示例

策略模式的概念引用:
        在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。
如查找、排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,
每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…或者case等条件判断语句来进行选择。
这两种实现方法我们都可以称之为硬编码,如果需要增加一种新的查找算法,需要修改封装算法类的源代码;更换查找算法,也需要修改客户端调用代码。
在这个算法类中封装了大量查找算法,该类代码将较复杂,维护较为困难。如果我们将这些策略包含在客户端,这种做法更不可取,将导致客户端程序庞大而且难以维护,
如果存在大量可供选择的算法时问题将变得更加严重.

举例说明:
一、出行旅游:我们可以有几个策略可以考虑:可以骑自行车,汽车,做火车,飞机。每个策略都可以得到相同的结果,但是它们使用了不同的资源。
选择策略的依据是费用,时间,使用工具还有每种方式的方便程度 。

二、在一个购物商城,在五一做了一个活动,所以图书类商品根据购买的金额做出以下折扣策略
1、购买满199元,打9折
2、购买满399元,打8折
3、购买满599元以上,打7折;

function BookStrategy() {
  this.calcPrice = function( price ) {
    console.log("未打折 = " + price);
  }
}
function BookCalc9Strategy() {
  this.calcPrice = function( price ) {
    console.log("原价是:"+ price +";打9折后:" + (price * 0.9));
  }
}

function BookCalc8Strategy() {
  this.calcPrice = function( price ) {
    console.log("原价是:"+ price +";打8折后:" + (price * 0.8));
  }
}

function BookCalc7Strategy() {
  this.calcPrice = function( price ) {
    console.log("原价是:"+ price +";打7折后:" + (price * 0.7));
  }
}
function PriceCalc( _strategy ) {
  this.strategy = _strategy;
  this.getPrice = function( price ) {
    return this.strategy.calcPrice( price );
  }
}

function Client() {

  var price = 100;
  var priceCalc = null;
  if ( 199 <= price && price < 399 ) {
    priceCalc = new PriceCalc(new BookCalc9Strategy());
  } else if ( 399 <= price && price < 599 ) {
    priceCalc = new PriceCalc(new BookCalc8Strategy());
  } else if ( 599 <= price ) {
    priceCalc = new PriceCalc(new BookCalc7Strategy());
  } else {
    priceCalc = new PriceCalc(new BookStrategy());
  }

  priceCalc.getPrice(price);

}
Client();
时间: 2024-08-26 12:45:15

【JS设计模式】策略模式的代码示例的相关文章

JS设计模式——策略模式

核心:定义一些列的算法(逻辑)封装起来,并且它们是平等关系可以相互替换js中的策略模式关键字:策略和业务分离 (一)基本实现 常见代码: function playGame(gameName){ let str; if(gameName == 'footBall'){ str = '不喜欢玩足球' }else if(method == 'basketball'){ str = '不喜欢玩蓝球' }else if(method == 'pingpang'){ str = '不喜欢玩乒乓' }els

js 设计模式——策略模式

策略模式(Strategy) 定义:将定义的一组算法封装起来,使其相互之间可以替换.封装的算法具有一定的独立性,不会随客户端的变化而变化 废话不多说,先来个例子 // 例如要写一个计算两个数加减乘除的方法,会有人这么写 countNum(type, num1, num2) { if(type === 'add'){ return num1 + num2 } else if(type === 'subtract'){ return num1 - num2 } else if(type === 'm

大话设计模式_策略模式(Java代码)

策略模式:定义算法家族,分别封装,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户 简单描述:一个父类,多个子类实现具体方法.一个Context类持有父类的引用(使用子类实例化此引用),客户端代码只需要与此Context类交互即可 大话设计模式中的截图: 例子代码: 策略类: 1 package com.longsheng.strategy; 2 3 public abstract class Strategy { 4 5 public abstract double getR

JavaScript设计模式 策略模式

在现实中,我们到达一个地方,通常可以选择不同的方式,例如自行车,火车,汽车,飞机等. 在程序设计中,通常也会有这样的情况,实现一个功能有多个方案可以选择,比如一个压缩文件的程序,既可以选择zip算法,也可以选择gzip算法. 而这种情况,在设计模式中,称为策略模式. 策略模式的定义:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换. 例子: 很多公司的年终奖是根据员工的工资基数和年底绩效情况来方法的.如S级绩效为4倍工资,A级有3倍工资,B级有两倍工资. 在不使用策略模式的情况下,

15. 星际争霸之php设计模式--策略模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248199.html============================================

设计模式 - 策略模式(Strategy Pattern) 具体解释

策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全部, 禁止转载, 如有须要, 请站内联系. 策略模式: 定义了算法族, 分别封装起来, 让它们之间能够相互替换, 此模式让算法的变化独立于使用算法的客户. 对于父类的子类族须要常常扩展新的功能, 为了使用父类比較灵活的加入子类, 把父类的行为写成接口(interface)的形式; 使用set()方法

设计模式 - 策略模式(Strategy Pattern) 详解

策略模式(Strategy Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权所有, 禁止转载, 如有需要, 请站内联系. 策略模式: 定义了算法族, 分别封装起来, 让它们之间可以相互替换, 此模式让算法的变化独立于使用算法的客户. 对于父类的子类族需要经常扩展新的功能, 为了使用父类比较灵活的添加子类, 把父类的行为写成接口(interface)的形式; 使用set()方法,

C++设计模式——策略模式

策略模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对策略模式是这样说的:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.该模式使得算法可独立于使用它的客户而变化. 策略模式为了适应不同的需求,只把变化点封装了,这个变化点就是实现不同需求的算法,但是,用户需要知道各种算法的具体情况.就像上面的加班工资,不同的加班情况,有不同的算法.我们不能在程序中将计算工资的算法进行硬编码,而是能自由的变化的.这就是策略模式. UML类图 Strategy:定义所有支持的算法的公共接

2.大话设计模式-策略模式

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DesignModel 8 { 9 /// <summary> 10 /// 策略模式 11 /// </summary> 12 public class TacticsModel 13 { 14 //对于