再起航,我的学习笔记之JavaScript设计模式20(策略模式)

news/2024/7/24 7:43:56 标签: javascript, 设计模式, 测试

策略模式

策略模式(Strategy):将定义的一组算法封装起来,使其相互之间可以替换。封装的算法具有一定的独立性,不会随客户端变化而变化。

其实策略模式在我们生活中可应用的地方还是比较多的,比如在商城搞促销的时候,会有很多打折的情况比如5折呀,7折呀,还会有各种返利,比如满200-100这类的活动,这种场景,我们的策略模式就可以应用上去

示例演示

//创建折扣策略对象
var DiscountStrategy = function() {
    //创建内部算法对象
    var stragtegy = {
        rebate30: function(price) {
            return price - parseInt(price / 100) * 30;
        },
        rebate50: function(price) {
            return price - parseInt(price / 100) * 50;
        },
        discount90: function(price) {
            return price * 100 * 90 / 10000
        },
        discount80: function(price) {
            return price * 100 * 80 / 10000
        },
        discount50: function(price) {
            return price * 100 * 50 / 10000
        }

    }
    //策略算法调用接口
    return {

        returnPrice: function(algorithm, price) {
            return stragtegy[algorithm] && stragtegy[algorithm](price);
        },
        ,//添加策略
        addStrategy: function(type, fn) {
            stragtegy[type] = fn;
        }

    }

}();

我们看一下具体的调用,另外我们之前添加了拓展策略的方法,我们一并测试

var price = DiscountStrategy.returnPrice('discount50', '210');
console.log(price);
//添加新策略
DiscountStrategy.addStrategy('discount70', function(price) {
    return price * 100 * 70 / 10000
})
price = DiscountStrategy.returnPrice('discount70', '210');
console.log(price);

774226-20170911130701110-1501634749.png

从结构上看,策略模式和状态模式很像,也是在内部封装一个对象,然后通过返回的接口对象实现对内部对象的调用,但是策略模式不需要管理状态、状态间没有依赖关系。策略之间可以相互替换、在策略对象内部保存的是相互独立的一些算法。

让我们再看一个我们实际场景可以应用的验证例子

实例演示

//表单正则验证策略对象
var checkInput = function() {
    var stragtegy = {
        //判断是否为空
        notNull: function(value) {
            return /\s/.test(value) ? '请输入内容' : '';
        },
        //判断是否为一个数字
        number: function(value) {
            return /^[0-9]+(\.[0-9]+)?$/.test(value) ? '' : '请输入数字'
        }
    }
    return {
        //验证接口
        check: function(type, value) {
            value = value.replace(/^\s+|\s+$/g, '');
            return stragtegy[type] ? stragtegy[type](value) : '没有该类型的检测方法'
        },
        //添加策略
        addStrategy: function(type, fn) {
            stragtegy[type] = fn;
        }
    }
}();

同样的我们调用测试

console.log(checkInput.check('number', 'a'));
console.log(checkInput.check('number', '0'));
checkInput.addStrategy('phone', function(value) {
    return /^\d{3}\-\d{8}$|^\d{4}-\d{7}$/.test(value) ? '' : '请输入正确的电话号码';
})
console.log(checkInput.check('phone', '12345678'));
console.log(checkInput.check('phone', '027-12345678'));

774226-20170911130859516-1745726076.png

总结

策略模式最主要的特点是创建一系列策略算法,没组算法处理的业务都是相同的,只是处理的过程或者处理的结果不一样,所以它们又是可以相互替换的,这样就解决了算法与使用者之间的耦合。在测试层面上讲,由于每组算法相互之间的独立性,该模式更方便与每组算法进行单元测试保证算法的质量。

策略模式的优点

  1. 策略模式封装了一组代码簇,并且封装的代码相互之间独立,便于对算法的重复引用,提高了算法的复用率。
  2. 策略模式与继承相比,在类的继承中继承的方法是被封装在类中,因此当需求很多算法时,就不得不创建出多种类,这样会导致算法与算法的使用者耦合在一起,不利于算法的独立演化,并且在类的外部改变类的算法难度也是极大的。
  3. 同状态模式一样,策略模式也是一种优化分支判断语句的模式,采用策略模式对算法封装使得算法更利于维护。
  4. 策略模式的缺点

  5. 由于选择算法的决定权在用户,所以用户就必须了解每种算法的实现,这样就增加了用户对策略模式的使用成本。
  6. 由于每种算法都相互独立,这样对于一些复杂的算法处理相同的逻辑部分无法实现共享,就会造成资源浪费(我们可以用襄垣模式来解决)。

也谢谢大家看到这里:)如果你觉得我的分享还可以请点击推荐,分享给你的朋友让我们一起进步~

好了以上就是本次分享的全部内容,本次示例参考自JavaScript设计模式一书,让我们一点点积累一点点成长,希望对大家有所帮助。

欢迎转载,转载请注明作者,原文出处。

转载于:https://www.cnblogs.com/chen-jie/p/JavaScript-Strategy.html


http://www.niftyadmin.cn/n/1630485.html

相关文章

github使用记录

gitHub的使用: 一:checkout a project from repo. ①:打开git shell ②:执行以下命令: git clone "project url" 例如: checkout struts2的源码: git clone git://github.com/apache/struts2.git "project url":可以从gitHub上对应的项目…

Css实现元素的垂直居中

在Css中尽管有vertical-align这个特性,但并未能解决所有的垂直居中问题,比如位置高度元素的垂直居中。下面列出一些实现元素居中的方法: 使用table实现元素的居中: 实现元素垂直居中的最简单方式应该就是利用table中设置单元格的 vertical-align:middle 了: css代…

dpdk接收数据包原理分析

dpdk简介请参考:dpdk简介 摘要 本文对dpdk数据包捕获技术原理进行了分析,对其优缺点进行了介绍。 对使用基于EAL的应用程序进行了分析,作出了程序流程图。 引言 背景浅析 随着云计算产业的异军突起,网络技术的不断创新&…

Azure Powershell对ARM资源的基本操作

本分主要介绍Windows Azure Powershell对ARM资源的基本操作 1.登陆ARM模式,命令:Login-AzureRmAccount -EnvironmentName AzureChinaCloud 2.获取当前账号下的订阅信息,命令:Get-AzureRmSubscription 3.设置指定的订阅为即将操作的…

CSS进阶1---应用方式分类及其创建方法

从CSS代码存放的位置来分&#xff0c;主要有外部样式表、内部样式表、行内样式表。外部样式表存在于HTML文件外部&#xff0c;一般以.css为后缀名&#xff1b;内部样式表存在于HTML文件内部&#xff0c;通常放在<head>标签内&#xff1b;行内样式表也在HTML文件内部&…

SVD的概念以及应用

第十四章 利用SVD简化数据 一&#xff0e;引言 SVD的全称是奇异值分解&#xff0c;SVD的作用是它能够将高维的数据空间映射到低维的数据空间&#xff0c;实现数据约减和去除噪声的功能。 SVD的特点主要有以下几个方面&#xff1a; 1.它的优点&#xff1a;去除噪声&#xff0c;简…

调试陷入死循环程序的方法

概述 应用程序陷入死循环后&#xff0c;界面可能不会有任何输出&#xff0c;所有的业务也不通&#xff0c;不易定位。 陷入死循环的程序占用的cpu使用率较高&#xff0c;通常可以通过使用top命令看出来。 对于多线程的程序&#xff0c;需要耐心调试&#xff0c;本文给出笔者…

JS实现系统调色板

整体页面代码&#xff1a;<html><head><meta http-equiv"Content-Type" content"text/html; charsetgb2311"><title>DW调色板</title><script type"text/javascript" language"javascript">var C…