资讯专栏INFORMATION COLUMN

策略模式-javascript

岳光 / 1013人阅读

摘要:一个基于策略模式的程序至少由两部分组成。优点策略模式利用组合委托和多态等技术和思想,可以有效地避免多重条件选择语句。在策略模式中利用组合和委托来让拥有执行算法的能力,这也是继承的一种更轻便的替代方案。

一个基于策略模式的程序至少由两部分组成。
第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。第二个部分是环境类Context,Context接受客户的请求,随后把请求委托给某一个策略类。

优点:

策略模式利用组合、委托和多态等技术和思想,可以有效地避免多重条件选择语句。

策略模式提供了对开放—封闭原则的完美支持,将算法封装在独立的strategy中,使得它们易于切换,易于理解,易于扩展。

策略模式中的算法也可以复用在系统的其他地方,从而避免许多重复的复制粘贴工作。

在策略模式中利用组合和委托来让Context拥有执行算法的能力,这也是继承的一种更轻便的替代方案。

缺点:

首先,使用策略模式会在程序中增加许多策略类或者策略对象,但实际上这比把它们负责的逻辑堆砌在Context中要好。

其次,要使用策略模式,必须了解所有的strategy,必须了解各个strategy之间的不同点,这样才能选择一个合适的strategy。比如,我们要选择一种合适的旅游出行路线,必须先了解选择飞机、火车、自行车等方案的细节。此时strategy要向客户暴露它的所有实现,这是违反最少知识原则的。

策略模块:(环境类)

define(function () {
    "use strict";

    var Validator = function () { };

    Validator.prototype.selectValidator = function (validator) {
        this.validator = validator;//validator就是验证函数

        return this;  //this指向validator对象
    };

    Validator.prototype.validate = function (value) {
        if (this.validator) {
            return this.validator.validate(value);//this.validator验证函数
        }
        throw ("No validator selected");
    };

    return Validator;
});

邮箱验证模块(策略类)

define(function () {
    "use strict";

    return {
        validate: function (value) {
            return value.indexOf("@") !== -1;//简单的邮箱验证
        }
    };
});

号码验证模块(策略类)

define(function () {
    "use strict";

    return {
        validate: function (value) {
            return (/^[0-9]{11}$/g).test(value);//可以严谨些
        }
    }
});

init模块

define(function (require) {
    "use strict";

    return {
        init: function () {

            var Strategy = require("strategy/strategy"),
                telValidator = require("strategy/telValidator"),
                emailValidator = require("strategy/emailValidator"),
                validator;

            validator = new Strategy();

            console.log(validator.selectValidator(telValidator).validate(012345678901));

            console.log(validator.selectValidator(emailValidator).validate("test"));
        }

    };

});

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/78815.html

相关文章

  • JavaScript设计模式----策略模式

    摘要:实际上在这种将函数作为一等对象的语言里,策略模式已经融入到了语言本身当中,我们经常使用高阶函数来封装不同的行为,并且把它传递到另一个函数中。 声明:这个系列为阅读《JavaScript设计模式与开发实践》 ----曾探@著一书的读书笔记 1.策略模式的定义 将不变的部分和变化的部分隔开是每个设计模式的主题。 定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。 2.策略模式...

    forrest23 评论0 收藏0
  • JavaScript 设计模式(二):策略模式

    摘要:策略模式实现的也是类似的场景。第二个部分是环境类不变,接收客户的请求,随后把请求委托给某一个策略类。参考文章设计模式设计模式与开发实践设计模式系统讲解与应用本文首发,期待作者以乐之名本文原创,有不当的地方欢迎指出。 showImg(https://segmentfault.com/img/bVbugi7?w=800&h=600); 策略模式:定义一系列的算法,把它们一个个封装起来,并且...

    荆兆峰 评论0 收藏0
  • JavaScript设计模式与开发实践系列之策略模式

    摘要:本系列为设计模式与开发实践作者曾探学习总结,如想深入了解,请支持作者原版策略模式策略模式的定义定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换。 本系列为《JavaScript设计模式与开发实践》(作者:曾探)学习总结,如想深入了解,请支持作者原版 策略模式 策略模式的定义:定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换。 举个形象的例子,使用策略模式计算...

    spademan 评论0 收藏0
  • JS策略模式JavaScript设计模式与开发实践》阅读笔记

    摘要:策略模式可以避免代码中的多重判断条件。策略模式在程序中或多或少的增加了策略类。此文仅记录本人阅读设计模式与开发实践这个本时的感受,感谢作者曾探写出这么好的一本书。设计模式中很重要的一点就是将不变和变分离出来。参考设计模式与开发实践曾探 策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且是它们可以相互替换。 策略模式可以避免代码中的多重判断条件。 策略模式很好的体现了开放-...

    Amos 评论0 收藏0
  • javascript设计模式--策略模式

    摘要:策略模式总结什么是策略模式策略模式的定义是定义一系列的算法,把他们独立封装起来,并且可以相互替换。策略模式的使用如果策略模式仅仅是用来封装算法,可能有点小才大用了。原文链接设计模式策略模式上一篇设计模式单例模式 javascript策略模式总结 1.什么是策略模式? 策略模式的定义是:定义一系列的算法,把他们独立封装起来,并且可以相互替换。 例如我们需要写一段代码来计算员工的奖金。当绩...

    ztyzz 评论0 收藏0
  • javascript设计模式--策略模式

    摘要:策略模式总结什么是策略模式策略模式的定义是定义一系列的算法,把他们独立封装起来,并且可以相互替换。策略模式的使用如果策略模式仅仅是用来封装算法,可能有点小才大用了。原文链接设计模式策略模式上一篇设计模式单例模式 javascript策略模式总结 1.什么是策略模式? 策略模式的定义是:定义一系列的算法,把他们独立封装起来,并且可以相互替换。 例如我们需要写一段代码来计算员工的奖金。当绩...

    李文鹏 评论0 收藏0

发表评论

0条评论

岳光

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<