1. 策略模式
  2. 发布-订阅模式
  3. 装饰器模式
  4. 适配器模式
  5. 代理模式
  6. 责任链模式

策略模式

一个需求:在登录时判断手机号和密码是否为空、手机号是否正确,一般情况下会反应出如下代码

  1. if(account===null||account===''){
  2. alert('手机号不能为空');
  3. return false;
  4. }
  5. if(pwd===null||pwd===''){
  6. alert('密码不能为空');
  7. return false;
  8. }
  9. if (!/(^1[3|4|5|7|8][0-9]{9}$)/.test(account)) {
  10. alert('手机号格式错误');
  11. return false;
  12. }

那如果还需要判断密码长度就得再加一条

  1. if(pwd.length<6){
  2. alert('密码不能小于六位');
  3. return false;
  4. }

使用策略模式可以这样:

  1. // 声明策略表
  2. const strategies = {
  3. /**
  4. * @param value {any} 需要判断的数据
  5. * @param errorMsg {string} 不符合规定的报错信息
  6. */
  7. isNonEmpty: function (value, errorMsg) {
  8. if (value === '' || value === null) {
  9. return errorMsg;
  10. }
  11. },
  12. isMobile: function (value, errorMsg) {
  13. if (!/(^1[3|4|5|7|8][0-9]{9}$)/.test(value)) {
  14. return errorMsg;
  15. }
  16. },
  17. minLength: function (value, length, errorMsg) {
  18. if (value.length < length) {
  19. return errorMsg;
  20. }
  21. }
  22. };
  23. // 使用策略模式,判断各种策略结果,假使获取到 phoneNumber,password
  24. let phoneIsNonEmpty = strategies.isNonEmpty(phoneNumber, '手机号不能为空!'),
  25. pwdIsNonEmpty = strategies.isNonEmpty(password, '密码不能为空!'),
  26. isMobile = strategies.isMobile(phoneNumber, '手机号不正确!'),
  27. minLength = strategies.minLength(password, 8, '密码太短!');
  28. let errorMsg = phoneIsNonEmpty || pwdIsNonEmpty || isMobile || minLength;
  29. if(errorMsg){
  30. return errorMsg
  31. }

发布-订阅模式

这样一个需求,当我们执行一个操作的时候需要影响到其他操作,比如我们新建一篇文章,需要增加积分、消息通知