策略模式说明

定义: 封装一系列的算法,使得他们之间可以相互替换,本模式使用算法独立于使用它的客户的变化。

说明:策略模式,是一种组织算法的模式,核心不在于算法,而在于组织一系列的算法,并且如何去使用它;策略模式作用在于,行为实现的不可预见,面对这样的一种变化,我们得思考如何使用程序好维跟扩展,并使得客户很好的使用算法的方式;

策略模式 使用要注意它 "变化" 的一面,策略模式就是来解决这个 变化 问题的。

比如商场买卖的价格或促销问题,如果不使用模式,就可能只是 把“所有”的情况用 if else 类似“硬编码” 的开式写在一起,或是传个传个参数,稍加点内部逻辑代码,最好就是一同写在一个类里面;

P如:

function Price(personType, price) {
//大客户 5 折
if (personType == 'vip') {
return price * 0.5;
}
else if (personType == 'old'){ //老客户 3 折
return price * 0.3;
} else {
return price; //其他都全价
}
}

我们把上面的看成一个类,如果要扩展一种价格手段,就得在 Price 里添加新的 else if,或是修改某个算法逻辑,就得某个 if 或 else if 里修改, 这是对单个类的修改,而且这种情况势必得经常修改这个类,这违反了设计模式的一个原则:对修改关闭,对扩展开放的原则;

而且这些算法,在不同客户面前可能会经常替换,固定参数也不能满足需求;

解决这种问题就可以使用策略模式,策略在于关注变化,把各行为不同的实现各自封装起来,比如要实现一只动物,走路,叫声,吃东西的各种表现,就可以把走路,叫声,吃东西,就可以定义三个接口抽象,然后把他们各自具体实现去实现三个接口;

前面说,策略模式是使算法可独立于使用的客户的改变,所以策略模式里,一般是在客户端定义选择使用的算法,传入相应的参数,再根据算法返回结果;

策略模式结构图:

这种有点类似简单工厂模式,这种再加层 Context 是为了客户使用起来更简单调用,不必自处理一些逻辑,让团队开发,更趋一致;Context 也可以做成一个基类,其下可以有多个实现子类继承;

Context 跟 Client 可以改为:

继承子类只需引用自己的实现接口算法,即可,这样客户可以更简单的调用,也不必理会各种动物使用什么接口,是怎么实现的了;

实例源码

这里以上面的商场价格手段来实现:

1. 实现几种算法,Javascript是弱类型,没有接口这号东西,就是直接写了;

vip 客户

function vipPrice() {
this.discount = 0.5;
} vipPrice.prototype.getPrice = function(price) {
  return price * this.discount;
}

老客户:

function oldPrice() {
this.discount = 0.3;
} oldPrice.prototype.getPrice = function(price) {
return price * this.discount;
}

普通客户

function Price() {
this.discount = 1;
} Price.prototype.getPrice = function(price) {
return price ;
}

2. 上下文:

function Context() {
this.name = '';
this.strategy = null;
this.price = 0;
} Context.prototype.set = function(name, strategy, price) {
this.name = name;
this.strategy = strategy;
this.price = price;
} Context.prototype.getResult = function() {
console.log(this.name + ' 的结账价为: ' + this.stragegy.getPrice(this.price));
}

3. 客户端使用;

// 上下文
var context = new Context(); //vip客户
var vip = new vipPrice();
context.set ('vip客户', vip, 200);
context.getPrice(); //老客户
var old = new oldPrice();
context.set ('老客户', old, 200);
context.getPrice(); //普通客户
//...

这样即使得 客户 与算法解藕,又使得修改跟扩展能独立的进行,不影到客户端或其他算法的使用;

其他说明

策略模式是一个非常实用跟常用的设计模式,普通用于商场价格,促销等场景,他跟工厂模式很像,可以说是他的一种升级版本;

策略模式相关模式:工厂模式,组合模式;

关健字:算法,变化,封装,上下文;

[设计模式] javascript 之 策略模式的更多相关文章

  1. javascript设计模式--策略模式

    javascript策略模式总结 1.什么是策略模式? 策略模式的定义是:定义一系列的算法,把他们独立封装起来,并且可以相互替换. 例如我们需要写一段代码来计算员工的奖金.当绩效为a时,奖金为工资的5 ...

  2. JavaScript实现策略模式

    在开篇之前先分享今天看到的一句关于设计模式的话:将不变的部分和变化的部分隔开是每个设计模式的主题 请大家自行感受这句话的精髓所在,并且思考学习设计模式究竟能给我们编程带来什么样的东西,欢迎大家在文章下 ...

  3. 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...

  4. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

  5. 《Head First 设计模式》[01] 策略模式

    <Head First 设计模式>(点击查看详情) 1.写在前面的话 之前在列书单的时候,看网友对于设计模式的推荐里说,设计模式的书类别都大同小异,于是自己就选择了Head First系列 ...

  6. [head first 设计模式] 第一章 策略模式

    [head first 设计模式] 第一章 策略模式 让我们先从一个简单的鸭子模拟器开始讲起. 假设有个简单的鸭子模拟器,游戏中会出现各种鸭子,此系统的原始设计如下,设计了一个鸭子超类,并让各种鸭子继 ...

  7. Python设计模式: 最佳的"策略"模式实践代码

    Python设计模式: 最佳的"策略"模式实践代码 今天抽空看了下流畅的python,发现里面介绍了不少python自带的库的使用实例,用起来非常的优雅. 平时用Python来写爬 ...

  8. JavaScript设计模式 Item 7 --策略模式Strategy

    1.策略模式的定义 何为策略?比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但是不在乎钱,可以选择坐飞机. 如果没有钱,可以选择坐大巴或者火车. 如果再穷一点,可以选 ...

  9. javascript设计模式实践之策略模式--输入验证

    策略模式中的策略就是一种算法或者业务规则,将这些策略作为函数进行封装,并向外提供统一的调用执行. 先定义一个简单的输入表单: <!DOCTYPE html> <html> &l ...

随机推荐

  1. Windows网络驱动、NDIS驱动(微端口驱动、中间层驱动、协议驱动)、TDI驱动(网络传输层过滤)、WFP(Windows Filtering Platform)

    catalog . 引言 . Windows 2000网络结构和OSI模型 . NDIS驱动 . NDIS微端口驱动编程实例 . NDIS中间层驱动编程实例 . NDIS协议层驱动编程实例 . TDI ...

  2. 用Python写了个抓图小脚本

    看上这个网页上一张图了,可惜他没有提供右键另存为,看了下网页代码,是可以找到图片原始链接的!但是因为没法和现实的图片一一对应,图又多,所以找起来还是麻烦...然后,我就想用 Python 把他们全部拉 ...

  3. CentOS解决因python升级导致的中文输入法无法正常使用的问题

    /usr/libexec/ibus-ui-gtk /usr/ bin/ibus-setup /usr/libexec/ibus-engine-table 将以上三个文件中的 “exec python” ...

  4. 如何保持自己 fork 的项目和原始项目同步

    首先先通过 github 的 web 页面 fork 目标的项目 前提是自己已经设置好了git,并且配置了相应的权限 然后使用git clone命令在本地克隆自己 fork 的项目: git clon ...

  5. hdu 2014 青年歌手大奖赛_评委会打分

    题意: 输入N个数,去掉最大和最小的数,求剩余的数的平均数. 解法: 找到分别最大和最小的数,然后从总和中减去他们,再求平均数(不要排序): 1: #include<stdlib.h> 2 ...

  6. 《JavaScript权威指南》学习笔记 第六天 开始学习DOM了。

    昨天学习了window对象的一些方法.window对象主要是针对当前视窗的操作.window对象提供了一些列API来帮助我们了解当前窗口的信息.例如history对象可以让我们获取浏览历史.nvaig ...

  7. UVA1213Sum of Different Primes(素数打表 + DP)

    题目链接 题意:选择k个素数,使得和为N(1120)的方案数: 筛选出 <= N 的素数,然后就背包 写的时候没初始dp[0][0] = 1;而且方案数也没相加,真是弱逼 #include &l ...

  8. [转发]Dumps of system information with Apple computers

    In this article, I gathered up all the dumps, who found. If you see something new table will be upda ...

  9. WinForm------关于子窗体刷新父窗体问题

    链接: http://wenwen.sogou.com/z/q242758397.htm

  10. windows 修改hosts 脚本

    @echo off echo "请注意你的杀毒软件提示,一定要允许" echo. & pause @del C:\Windows\System32\drivers\etc\ ...