前端策略模式&应用

周郎妙计安天下,陪了夫人又折兵

诸葛亮三个锦囊妙计

 问题??? 为什么不只做一个锦囊,把妙计都写在一张纸上

优点:

    1. 赵云看起来方便

    2. 锦囊可以用多次

    3. 随意添加新的锦囊

--》诸葛亮思路清晰  --》 策略模式的高手

    策略模式:需要在不同情况下使用不同的策略

   1.代码清晰,易维护

   2.随意组合,可复用

   3.任意扩展,不影响原有逻辑

技术抽象

1.环境(Context)角色:持有一个Strategy的引用
2.抽象策略(Strategy)角色:这是一个抽象角色,通常有一个接口或抽象类实现
3.具体策略(ConcreteStartegy)角色:包装了相关的算法或者行为

实例 validator 表单校验

抽象策略(Strategy)角色

 具体策略(ConcreteStartegy)角色

import { string } from "public/js/html-docx";

export enum ValidatorEnum {
  validateServer = 'validateServer',
  validateEmail = 'validateEmail',
  validatePhone = 'validatePhone',
  validateIpV4 = 'validateIpV4',
  validateIpV6 = 'validateIpV6',
}

interface IStrategy {
  [propName: string]: (value: any, errorMsg: string) => string;
}


const validatorConfig:IStrategy = {
  // 服务器地址验证 域名验证
  validateServer: (value, errorMsg: string) => {
    const reg = /^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$/;
    if (!reg.test(value)) {
      return errorMsg;
    }
    return '';
  },
  // 邮箱验证
  validateEmail: (value, errorMsg) => {
    const reg = /^[\w\d]+([._\\-]*[\w\d])*@([\w\d]+[-\w\d]*[\w\d]+\.){1,63}[\w\d]+$/;
    if (!reg.test(value)) {
      return errorMsg;
    }
    return '';
  },
  // 手机号验证
  validatePhone: (value, errorMsg) => {
    const reg = /^((1[3|3|4|5|6|7|8][0-9])+\d{8})$/;
    if (!reg.test(value)) {
      return errorMsg;
    }
    return '';
  },

  validateIpV4: (value, errorMsg) => {
    const reg = /^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/i;
    if (!reg.test(value)) {
      return errorMsg;
    }
    return '';
  },
  validateIpV6: (value, errorMsg) => {
    const reg = /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i;
    if (!reg.test(value)) {
      return errorMsg;
    }
    return '';
  },
};

export default validatorConfig;

环境(Context)角色

import validatorConfig from '@/config/validators.config';

interface strategy {
  strategy: string;
  errorMsg: string;
}

interface Iparams {
  [propName: string]: any;
}

interface Ivalidator {
  [propName: string]: strategy[];
}

interface Icatch {
  params: Iparams;
  fieldValidator: Iparams;
}

export default class Validator {
  catch: Icatch;

  constructor(n: Icatch) {
    this.catch = n;
  }

  add(params: Iparams, fieldValidator: Ivalidator): void {
    const obj = {
      params: params,
      fieldValidator: fieldValidator,
    };
    this.catch = obj;
  }

  check(): any {
    const { params, fieldValidator } = this.catch;
    let errorInfo = {};
    for (const k in params) {
      let errorObj = {};
      for (const valid of fieldValidator[k]) {
        const msg = validatorConfig[valid.strategy](params[k], valid.errorMsg);
        if (msg) {
          errorObj[k] = msg;
          break;
        }
      }
      errorInfo = { ...errorInfo, ...errorObj };
    }
    return errorInfo;
  }
}

应用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值