iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >javascript设计模式中的策略模式怎么实现
  • 188
分享到

javascript设计模式中的策略模式怎么实现

2023-06-26 04:06:42 188人浏览 独家记忆
摘要

这篇文章主要讲解了“javascript设计模式中的策略模式怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript设计模式中的策略模式怎么实现”吧!一. 认识策略模式策略

这篇文章主要讲解了“javascript设计模式中的策略模式怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript设计模式中的策略模式怎么实现”吧!

一. 认识策略模式

策略模式的定义:定义一系列的算法,将他们一个个封装起来,使他们直接可以相互替换。

策略模式是开发中常用的第二种设计模式,它在开发中非常常见,由两部分组成。第一部分是策略类,封装了许多具体的,相似的算法。第二部分是环境类,接受客户请求,随后将请求委托给策略类。说的通俗一点就是将相同算法的函数存放在一个包装里边,每个函数用相同的方式拿出来,就叫做策略模式。下面我们来通过代码实现深入了解一下。

二. 具体实现和思想

假如需要实现一个计算员工奖金的程序,效绩为 S 则发基本工资的4倍,A 则3倍,以此类推,那么我们正常实现该代码,是通过判断分支语句来实现。

1. 通过分支实现

        let bonus = function (perfORMance, salary) {            if(performance === "S") {                return salary*4;            }            if(performance === "A") {                return salary*3;            }            if(performance === "B") {                return salary*2;            }        }

分析:该实现存在显著的缺点,如果随着效绩 的扩展,比如增加C,D,E, if 分支不断累加,使得代码越来越庞大。

因此我们使用策略模式来重构代码。

2.使用策略模式实现

        let performanceS = function () {};        performanceS.prototype.calculate = function ( salary ) {            return salary*4        }        let performanceA = function () {};        performanceA.prototype.calculate = function ( salary ) {            return salary*3        }        let performanceB = function () {};        performanceB.prototype.calculate = function ( salary ) {            return salary*2        }        let performanceC = function () {};        performanceC.prototype.calculate = function ( salary ) {            return salary*1        }         let 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 () {            if(!this.strategy) {                throw new Error("未设置绩效");            }            return this.strategy.calculate(this.salary);        }         let bonus = new Bonus();        bonus.setSalary(10000);        bonus.setStrategy(new performanceS());        console.log(bonus.getBonus());

分析:重构后,我们将每种绩效算法单独成一个函数,需要计算某种绩效时只需要将其传入 getBonus 函数中,去掉了 if 分支,减少了性能消耗,并且使代码有了弹性,随时增加其他绩效,不需要更改原代码。

主要思想:这段代码基于面向对象语言,引入了多态的概念,不适用于js

3. JavaScript 版本的策略模式

        // js中函数也是对象,直接将 strategy 定义为函数        let strategy = {            "S": function ( salary ){                return salary*4;            },            "A": function ( salary ) {                return salary*3;            },            "B": function ( salary ) {                 return salary*2;            }        }        let calculateBonus = function ( level, salary ) {            return strategy[ level ]( salary );        }        console.log(calculateBonus('A', 20000)) // 6000

分析:js 的对象可以直接创建,将函数封装进去,这样一来,代码显得清晰简洁。代码的复用,弹性也随之变强。

以上就是 js 设计模式策略模式的主要思想和实现,他在应用中有两个主要的作用,一是策略模式实现晃动动画;二是实现表单验证,有能力有兴趣的小伙伴可以往下看。

三. 策略模式的实际运用

1. 使用策略模式实现缓存动画

        // 缓动算法        let tween = {            linear (t, b, c, d) {                return c*t/d + b;            },            easeIn (t, b, c, d) {                return c*(t /= d) *t + b;            },            strongEaseIn (t, b, c, d) {                return c*(t /= d) *t *t *t *t + b;            }        }         // 定义一个动画类,参数为要运动的 dom 节点        let Animate = function ( dom ) {            this.dom = dom;            this.startTime = 0;            this.startPos = 0;            this.endPos = 0;            this.propertyName = null;            this.easing = null; // 缓动算法            this.duration = null;        }         // 启动方法        Animate.prototype.start = function (propertyName, endPos, duration, easing) {            this.startTime =+ new Date;            this.startPos = this.dom.getBoundinGClientRect()[propertyName]; // dom 初始位置            this.propertyName = propertyName;            this.endPos = endPos;            this.duration = duration;            this.easing = tween[easing];             let self = this;            let timeId = setInterval(() => {                if( self.step() === false){                    clearInterval(timeId);                }            }, 19);        }         // 实现小球每一帧要做的事情        Animate.prototype.step = function () {            let t =+ new Date;            if(t>this.startTime + this.duration){                this.update(this.endPos);                return false;            }            let pos = this.easing(t - this.startTime, this.startPos, this.endPos - this.startPos, this.duration);            this.update(pos);        }         Animate.prototype.update = function (pos) {            this.dom.style[this.propertyName] = pos + 'px';        }         let test = function () {            let div = document.getElementById('div');            let animate = new Animate(div);            animate.start('left', 500, 1000, 'strongEaseIn');            // animate.start('top', 1500,  500, 'strongEaseIn');        }        test();

2. 使用策略模式进行表单验证

        let strategies = {            isNonEmpty ( value, errorMsg) { // 判断是否为空                if(value === '') {                    return errorMsg;                }            },            minLength (value, length, errorMsg){                if (value.length < length) {                    return errorMsg;                }            }        }         let dom = document.forms[0].acount;         let validatarFunc = function () {            let validator = new Validator();            // 添加校验规则            validator.add(dom, 'isNonEmpty', '用户名不能为空!');            let errorMsg = validator.start();            return errorMsg; // 返回校验结果        }                 // 实现表单校验保存类        let Validator = function () {            this.cache = []; // 保存校验规则        }        Validator.prototype.add = function (dom, rule, errorMsg) {            let ary = rule.split(':');            this.cache.push( function(){                let strategy = ary.shift();                ary.unshift(dom.value);                ary.push( errorMsg );                return strategies[strategy].apply(dom, ary);            })        }        Validator.prototype.start = function () {            for(let i = 0, validatorFunc; validatorFunc = this.cache[i++];){                let msg = validatorFunc();                if( msg ) {                    return msg;                }            }        }         document.forms[0].addEventListener('submit', (e) =>{            let errorMsg = validatarFunc();            if(errorMsg){                alert(errorMsg);                e.preventDefault();            }        })

分析:第一个实现中是把缓动算法封装在一个对象中,调用他们时便于相互替换,也便于扩展。

第二个实现是将校验规则封装起来。

感谢各位的阅读,以上就是“javascript设计模式中的策略模式怎么实现”的内容了,经过本文的学习后,相信大家对javascript设计模式中的策略模式怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: javascript设计模式中的策略模式怎么实现

本文链接: https://www.lsjlt.com/news/306857.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • javascript设计模式中的策略模式怎么实现
    这篇文章主要讲解了“javascript设计模式中的策略模式怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript设计模式中的策略模式怎么实现”吧!一. 认识策略模式策略...
    99+
    2023-06-26
  • javascript设计模式之策略模式
    目录一. 认识策略模式二. 具体实现和思想三. 策略模式的实际运用四. 总结一. 认识策略模式 策略模式的定义:定义一系列的算法,将他们一个个封装起来,使他们直接可以相互替换。 策略...
    99+
    2024-04-02
  • java设计模式之策略模式怎么实现
    这篇文章主要介绍了java设计模式之策略模式怎么实现,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。策略模式:策略模式是一种定义一系列算法的方法,算法完成的工作都是相同的工作,...
    99+
    2023-05-31
    java
  • Java设计模式中的策略模式如何实现
    这篇文章主要介绍了Java设计模式中的策略模式如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java设计模式中的策略模式如何实现文章都会有所收获,下面我们一起来看看吧。1 概述在平时开发中,往往会遇到这...
    99+
    2023-06-30
  • JavaScript设计模式之策略模式详解
    什么是设计模式?为什么需要学习设计模式? 学习设计模式的目的是:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络...
    99+
    2024-04-02
  • java策略设计模式怎么实现
    在Java中实现策略设计模式,可以按照如下步骤进行:1. 定义一个策略接口(或者抽象类),该接口包含多个具体策略类共同的方法。2. ...
    99+
    2023-08-31
    java
  • JavaScript中怎么实现策略模式
    今天就跟大家聊聊有关JavaScript中怎么实现策略模式,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。策略模式:定义了一系列家族算法,并对每一种算...
    99+
    2024-04-02
  • PHP行为设计模式之策略模式怎么实现
    这篇“PHP行为设计模式之策略模式怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“PHP行为设计模式之策略模式怎么实现...
    99+
    2023-07-06
  • JavaScript设计模式策略模式案例分享
    前言 策略设计模式就是指一个问题匹配多个解决方法,不一定要用到哪一个,而且有可能随时增加多个方案 比如我们去买书,书店都会搞一些优惠活动,满100减20,满200减50,八折优惠这些...
    99+
    2024-04-02
  • C#设计模式之策略模式
    策略模式 所谓策略其实就是做一件事情有很多很多的方法,比如说一个商场要搞促销,促销的方式有可能有很多:打折啊,满100返50啊、积分等等之类的。这种不同的促销方式在我们系统中表示就是...
    99+
    2024-04-02
  • Java设计模式之策略模式
    在一个收银系统中,如果普通用户、中级会员、高级会员分别对应着不同的优惠策略,常规编程就要使用一系列的判断语句,判断用户类型,这种情况下就可以使用策略模式。 一、概念理解 策略模式的概...
    99+
    2022-11-13
    Java 设计模式 策略模式
  • QtC++ 设计模式(四)——策略模式
    策略模式 序言理解源码 序言 还是参考的菜鸟教程,会C++的还是看C++的方式来得舒服。 . 理解 使用符合UML规范的便于理解和回忆,接口其实就是普通的基类 . 源码 strategy.h /// 策略class Strat...
    99+
    2023-08-30
    c++ 设计模式 策略模式
  • Java 设计模式中的策略模式详情
    目录策略模式的应用场景是否符合有没有必要不用策略模式例子使用策略模式策略上下文策略接口以及具体实现类Main类两种方式的不同策略模式有没有必要使用?如何避免Context类使用判断逻...
    99+
    2024-04-02
  • Java行为型设计模式之策略模式怎么实现
    本文小编为大家详细介绍“Java行为型设计模式之策略模式怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java行为型设计模式之策略模式怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.策略设计模...
    99+
    2023-07-04
  • JS设计模式之策略模式怎么用
    小编给大家分享一下JS设计模式之策略模式怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!策略模式的概念引用:在软件开发中也常...
    99+
    2024-04-02
  • 怎么理解Java设计模式的策略模式
    这篇文章主要讲解了“怎么理解Java设计模式的策略模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Java设计模式的策略模式”吧!一、什么是策略模式策略模式定义了一系列算法,并将每...
    99+
    2023-06-25
  • Python设计模式中的策略模式详解
    目录策略模式命令模式策略模式 策略模式是一个经典的模式,简化代码。 电商领域有个功能明细可以使用“策略”模式,就是根据客户的属性或订单中的商品计算折扣。 比如...
    99+
    2023-02-08
    Python策略模式 Python设计模式
  • java设计模式的策略模式是什么
    这篇文章主要介绍“java设计模式的策略模式是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java设计模式的策略模式是什么”文章能帮助大家解决问题。策略模式亦称:Strategy意图策略模式是...
    99+
    2023-07-02
  • java设计模式--策略模式详解
    目录策略模式Demo代码:总结策略模式 策略模式(Strategy Pattern)属于行为型模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。用算法族分别封装起来...
    99+
    2024-04-02
  • Python设计模式中的行为型策略模式
    目录一、策略模式二、应用场景三、代码示例一、策略模式 策略模式中,首先定义了一系列不同的算法,并把它们一一封装起来,然后在策略类中,使这些算法可以相互替换。这意味着,让一个类的行为(...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作