• 前端代理模式之【策略模式】


    前言

    hello world欢迎来到前端的新世界


    😜当前文章系列专栏:前端设计模式
    🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误,感谢大家指出)🌹
    💖感谢大家支持!您的观看就是作者创作的动力

    介绍

    • 策略模式简单描述就是:对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。把它们一个个封装起来,并且使它们可以互相替换

    代码

    <html>
    <head>
        <title>策略模式-校验表单</title>
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
    </head>
    <body>
        <form id = "registerForm" method="post" action="http://xxxx.com/api/register">
            用户名:<input type="text" name="userName">
            密码:<input type="text" name="password">
            手机号码:<input type="text" name="phoneNumber">
            <button type="submit">提交</button>
        </form>
        <script type="text/javascript">
            // 策略对象
            const strategies = {
              isNoEmpty: function (value, errorMsg) {
                if (value === '') {
                  return errorMsg;
                }
              },
              isNoSpace: function (value, errorMsg) {
                if (value.trim() === '') {
                  return errorMsg;
                }
              },
              minLength: function (value, length, errorMsg) {
                if (value.trim().length < length) {
                  return errorMsg;
                }
              },
              maxLength: function (value, length, errorMsg) {
                if (value.length > length) {
                  return errorMsg;
                }
              },
              isMobile: function (value, errorMsg) {
                if (!/^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|17[7]|18[0|1|2|3|5|6|7|8|9])\d{8}$/.test(value)) {
                  return errorMsg;
                }                
              }
            }
            
            // 验证类
            class Validator {
              constructor() {
                this.cache = []
              }
              add(dom, rules) {
                for(let i = 0, rule; rule = rules[i++];) {
                  let strategyAry = rule.strategy.split(':')
                  let errorMsg = rule.errorMsg
                  this.cache.push(() => {
                    let strategy = strategyAry.shift()
                    strategyAry.unshift(dom.value)
                    strategyAry.push(errorMsg)
                    return strategies[strategy].apply(dom, strategyAry)
                  })
                }
              }
              start() {
                for(let i = 0, validatorFunc; validatorFunc = this.cache[i++];) {
                  let errorMsg = validatorFunc()
                  if (errorMsg) {
                    return errorMsg
                  }
                }
              }
            }
    
            // 调用代码
            let registerForm = document.getElementById('registerForm')
    
            let validataFunc = function() {
              let validator = new Validator()
              validator.add(registerForm.userName, [{
                strategy: 'isNoEmpty',
                errorMsg: '用户名不可为空'
              }, {
                strategy: 'isNoSpace',
                errorMsg: '不允许以空白字符命名'
              }, {
                strategy: 'minLength:2',
                errorMsg: '用户名长度不能小于2位'
              }])
              validator.add(registerForm.password, [ {
                strategy: 'minLength:6',
                errorMsg: '密码长度不能小于6位'
              }])
              validator.add(registerForm.phoneNumber, [{
                strategy: 'isMobile',
                errorMsg: '请输入正确的手机号码格式'
              }])
              return validator.start()
            }
    
            registerForm.onsubmit = function() {
              let errorMsg = validataFunc()
              if (errorMsg) {
                alert(errorMsg)
                return false
              }
            }
        </script>
    </body>
    </html>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106

    场景例子

    • 如果在一个系统里面有许多类,它们之间的区别仅在于它们的’行为’,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
    • 一个系统需要动态地在几种算法中选择一种。
    • 表单验证

    优缺点

    优点

    • 利用组合、委托、多态等技术和思想,可以有效的避免多重条件选择语句
    • 提供了对开放-封闭原则的完美支持,将算法封装在独立的strategy中,使得它们易于切换,理解,易于扩展
    • 利用组合和委托来让Context拥有执行算法的能力,这也是继承的一种更轻便的代替方案

    缺点

    • 会在程序中增加许多策略类或者策略对象
    • 要使用策略模式,必须了解所有的strategy,必须了解各个strategy之间的不同点,这样才能选择一个合适的strategy

    后言

    创作不易,要是本文章对广大读者有那么一点点帮助 不妨三连支持一下,您的鼓励就是博主创作的动力

  • 相关阅读:
    SpringCloudAlibaba微服务分布式架构
    Vue中的$nextTick有什么作用?
    pandas导入到数据库
    Python二维码生成工具
    KMP算法的一些注意事项
    AIX 7.2 虚拟机 bash安装及 Aix 文件名补齐 使用优化篇
    基于单片机的音乐盒
    JavaScript switch语句
    城市建筑空间杂志城市建筑空间杂志社城市建筑空间编辑部2022年第7期目录
    go 语言 mage 安装踩坑
  • 原文地址:https://blog.csdn.net/weixin_68537796/article/details/134424830