博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[设计模式] javascript 之 策略模式
阅读量:5888 次
发布时间:2019-06-19

本文共 2139 字,大约阅读时间需要 7 分钟。

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

 
说明:策略模式,是一种组织算法的模式,核心不在于算法,而在于组织一系列的算法,并且如何去使用它;策略模式作用在于,行为实现的不可预见,面对这样的一种变化,我们得思考如何使用程序好维跟扩展,并使得客户很好的使用算法的方式;
 
策略模式 使用要注意它 "变化" 的一面,策略模式就是来解决这个 变化 问题的。
 
比如商场买卖的价格或促销问题,如果不使用模式,就可能只是 把“所有”的情况用 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. 实现几种算法, script是弱类型,没有接口这号东西,就是直接写了;
 
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();
 
//普通客户
//...
 
这样即使得 客户 与算法解藕,又使得修改跟扩展能独立的进行,不影到客户端或其他算法的使用;
 
其他说明
 
策略模式是一个非常实用跟常用的设计模式,普通用于商场价格,促销等场景,他跟工厂模式很像,可以说是他的一种升级版本;
 
策略模式相关模式:工厂模式,组合模式;

转载地址:http://cdgix.baihongyu.com/

你可能感兴趣的文章
Android 网络编程 记录
查看>>
微软同步发行Windows 10和Windows 10 Mobile系统更新
查看>>
Zeppelin的入门使用系列之使用Zeppelin运行shell命令(二)
查看>>
form表单下的button按钮会自动提交表单的问题
查看>>
那些年追过的......写过的技术博客
查看>>
python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列
查看>>
CSS魔法堂:Transition就这么好玩
查看>>
C/C++ 多线程机制
查看>>
如何使用Core Text计算一段文本绘制在屏幕上之后的高度
查看>>
2010技术应用计划
查看>>
Winform开发框架之权限管理系统改进的经验总结(3)-系统登录黑白名单的实现...
查看>>
JavaScript高级程序设计--对象,数组(栈方法,队列方法,重排序方法,迭代方法)...
查看>>
【转】 学习ios(必看经典)牛人40天精通iOS开发的学习方法【2015.12.2
查看>>
在 ASP.NET MVC 中使用异步控制器
查看>>
SQL语句的执行过程
查看>>
详解Linux中Load average负载
查看>>
PHP遍历文件夹及子文件夹所有文件
查看>>
WinForm程序中两份mdf文件问题的解决
查看>>
程序计数器、反汇编工具
查看>>
Android N: jack server failed
查看>>