JavaScript设计模式(十八):活诸葛-策略模式

简介: 活诸葛-策略模式

策略模式(Strategy)

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

策略对象(需求:商场促销活动)

这种模式我们不需要关注内部的算法是什么,只需要关注最终返回的结果即可,类似状态模式

// 价格策略对象
var PriceStrategy = (function () {
   
   
    // 内部算法对象
    var stragtegy = {
   
   
        // 100 返 30
        return30(price) {
   
   
            // parseInt可通过~~、|等运算符替换,要注意此时price要在[-2147483648, 
            // 2147483647]之间
            // +price 转化为数字类型
            return +price + parseInt(price / 100) * 30;
        },
        // 100 返 50
        return50(price) {
   
   
            return +price + parseInt(price / 100) * 50;
        },
        // 9 折
        percent90(price) {
   
   
            // JavaScript 在处理小数乘除法有bug,故运算前转化为整数
            return price * 100 * 90 / 10000;
        },
        // 8 折
        parcent80(price) {
   
   
            return price * 100 * 80 / 10000;
        },
        // 5 折
        percent50(price) {
   
   
            return price * 100 * 50 / 10000;
        }
    }
    // 策略算法调用接口
    return function (algorithm, price) {
   
   
        // 如果算法存在,则调用算法,否则返回false
        return stragtegy[algorithm] && stragtegy[algorithm](price)
    }
}());

let price = PriceStrategy('percent50', 100);
console.log(price); // 50

缓冲函数jq中的策略模式

image.png

<div class="box1" style="height: 100px;background-color: red;"></div>
    <div class="box2" style="height: 100px;background-color: greenyellow"></div>
    <div class="box2" style="height: 100px;background-color: blue;"></div>
    <div class="box2" style="height: 100px;background-color: yellow;"></div>
<script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.5.1.min.js"></script>
<script>  
    $('.box1').animate({
    
     width: '200px' }, 5000, 'linear');
    $('.box2').animate({
    
     width: '200px' }, 5000, 'swing');
    $('.box3').animate({
    
     width: '200px' }, 5000, 'easeOutQuart');
    $('.box4').animate({
    
     width: '200px' }, 5000, 'easeOutBounce');
</script>

表单验证

策略模式的表单示例

// 表单正则验证策略对象
var InputStrategy = (function () {
   
   
    var strategy = {
   
   
        // 是否为空
        notNull(value) {
   
   
            return /\s+/.test(value) ? '请输入内容' : '正确';
        },
        // 是否是一个数字
        number(value) {
   
   
            return /^[0-9]+(\.[0-9]+)?$/.test(value) ? '正确' : '请输入数字';
        },
        // 是否是本地电话
        phone(value) {
   
   
            return /^\d{3}\-\d{8}$|^\d{4}\-\d{7}$/.test(value) ? '正确' : `请输入正
            确的电话号码格式, 如: 010-12345678 或 0418-1234567`;
        }
    }
    return {
   
   
        // 验证接口 type 算法 value 表单值
        check(type, value) {
   
   
            // 去除收尾空白符
            value = value.replace(/^\s+|\s+$/g, '');
            return strategy[type] ? strategy[type](value) : '没有该类型的检测方法'
        },
        // 添加策略
        addStrategy(type, fn) {
   
   
            strategy[type] = fn;
        }
    }
}());

InputStrategy.check('number', '1234');  // '正确'
InputStrategy.check('number', '123a4'); // '请输入数字'

InputStrategy.check('username', 'Lee'); // '没有该类型的检测方法'
InputStrategy.addStrategy('username', function (value) {
   
   
    return value.length <= 3 ? '正确' : '用户名不得大于3个字符';
});
InputStrategy.check('username', 'Lee'); // '正确'
InputStrategy.check('username', 'PLee'); // '用户名不得大于3个字符'

特点:

  • 策略模式优点
    1. 策略模式封装了一组代码簇,并且封装的代码相互之间独立,便于对算法的重复引用提高了算法的复用率
    2. 策略模式继承相比,在类的继承当需求很多算法时,就不得不创建出多种类,这样会导致算法与算法的使用者耦合在一起不利于算法的独立演化,并且在类的外部改变类的算法难度也是极大的
    3. 同状态模式一样,策略模式也是一种优化分支判断语句的模式,采用策略模式 对算法封装使得算法利于维护
  • 策略模式缺点
    • 由于选择哪种算法的决定权在用户,所以对用户来说就必须了解每种算法的实现。这就增加了用户对策略对象的使用成本。其次,由于每种算法间相互独立,这样对于一些复杂的算法处理相同逻辑的部分无法实现共享,这就会造成一些资源的浪费。当然你可以通过享元模式来解决
目录
相关文章
|
4月前
|
设计模式 算法 Java
设计模式觉醒系列(04)策略模式|简单工厂模式的升级版
本文介绍了简单工厂模式与策略模式的概念及其融合实践。简单工厂模式用于对象创建,通过隐藏实现细节简化代码;策略模式关注行为封装与切换,支持动态替换算法,增强灵活性。两者结合形成“策略工厂”,既简化对象创建又保持低耦合。文章通过支付案例演示了模式的应用,并强调实际开发中应根据需求选择合适的设计模式,避免生搬硬套。最后推荐了JVM调优、并发编程等技术专题,助力开发者提升技能。
|
4月前
|
设计模式 算法 搜索推荐
【设计模式】【行为型模式】策略模式(Strategy)
一、入门 什么是策略模式? 策略模式是一种行为设计模式,允许在运行时选择算法或行为。它将算法封装在独立的类中,使得它们可以互换,而不影响客户端代码。 为什么需要策略模式? 策略模式的主要目的是解决算法
100 14
|
10月前
|
设计模式 算法 Kotlin
Kotlin - 改良设计模式 - 策略模式
Kotlin - 改良设计模式 - 策略模式
123 4
|
7月前
|
设计模式 算法 开发者
「全网最细 + 实战源码案例」设计模式——策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,用于定义一系列可替换的算法或行为,并将它们封装成独立的类。通过上下文持有策略对象,在运行时动态切换算法,提高代码的可维护性和扩展性。适用于需要动态切换算法、避免条件语句、经常扩展算法或保持算法独立性的场景。优点包括符合开闭原则、运行时切换算法、解耦上下文与策略实现、减少条件判断;缺点是增加类数量和策略切换成本。示例中通过定义抽象策略接口和具体策略类,结合上下文类实现动态算法选择。
219 8
「全网最细 + 实战源码案例」设计模式——策略模式
|
7月前
|
设计模式 JavaScript 算法
浅谈几种js设计模式
设计模式是软件开发中的宝贵工具,能够提高代码的可维护性和扩展性。通过单例模式、工厂模式、观察者模式和策略模式,我们可以解决不同场景下的实际问题,编写更加优雅和高效的代码。
144 8
|
9月前
|
设计模式 存储 缓存
前端必须掌握的设计模式——策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,旨在将多分支复杂逻辑解耦。每个分支类只关心自身实现,无需处理策略切换。它避免了大量if-else或switch-case代码,符合开闭原则。常见应用场景包括表单验证、风格切换和缓存调度等。通过定义接口和上下文类,策略模式实现了灵活的逻辑分离与扩展。例如,在国际化需求中,可根据语言切换不同的词条包,使代码更加简洁优雅。总结来说,策略模式简化了多条件判断,提升了代码的可维护性和扩展性。
|
10月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
97 1
|
10月前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
124 2
|
10月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
94 2
|
11月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文通过游泳运动员的案例,介绍策略模式及其在Kotlin中的改良应用,利用高阶函数简化代码结构,提高灵活性。
103 3