资讯专栏INFORMATION COLUMN

设计模式之策略模式

kk_miles / 1147人阅读

摘要:前端设计模式策略模式解决的问题策略模式要解决的问题是,代码的复用和扩展问题。如果没有策略模式的代码是将处理函数代码与逻辑代码混在一起写,这样写的好处是一次写好,但代码的扩展性与代码的复用性不好。

</>复制代码

  1. @(前端)[设计模式,JavaScript,TypeScript]

策略模式解决的问题:策略模式要解决的问题是,代码的复用和扩展问题。如果没有策略模式的代码是将处理函数代码与逻辑代码混在一起写,这样写的好处是一次写好,但代码的扩展性与代码的复用性不好。

没有用策略模式的例子代码

</>复制代码

  1. var calculateBonus = function( performanceLevel, salary ){
  2. if ( performanceLevel === "S" ){
  3. return salary * 4;
  4. }
  5. if ( performanceLevel === "A" ){
  6. return salary * 3;
  7. }
  8. if ( performanceLevel === "B" ){
  9. return salary * 2;
  10. }
  11. };
  12. calculateBonus( "B", 20000 ); //40000
  13. calculateBonus( "S", 6000 ); // 24000

可以看到的缺点是:如果想要扩充代码,只能在原来的对象上插入新的代码,对于代码的原作者来说这不是为题,但是对于看别人写的代码的人来说这样的代码想要做后期的维护难度之高可想而知。为了写出具有高复用性,好维护的,可扩展的代码来说这样的代码风格是不合适的。

解决问题的思路

1.分离出代码中“变”与“不变”的部分。其中“变”的部分是啥?应该是后续代码中要扩展的部分,不是将内容固定死的代码。而不变的部分就是代码调用部分,通常来说代码中的调用部分是固定不变的。
2.所以将本来深度耦合的代码分离出来,我自己给取了名字叫条件代码调用代码;条件代码时可变的可扩展的,通常放到外部的模块中用来调用和提高可维护性。而调用代码提供set`get类方法用来设置条件代码的运行时需要的参数和调用调用代码用来输出结果。

条件代码

</>复制代码

  1. /* 定义各种计算方式 */
  2. class L1{
  3. calculate(base:number){
  4. return base*2;
  5. }
  6. }
  7. class L2{
  8. calculate(base:number){
  9. return base*3;
  10. }
  11. }
  12. class L3 {
  13. calculate(base: number) {
  14. return base * 4;
  15. }
  16. }
调用代码

</>复制代码

  1. /* 定义计算的调用方法类 */
  2. class Calculate{
  3. private base: number;
  4. private way: any;
  5. setBase(base: number) {
  6. this.base = base;
  7. }
  8. setLeve(leve:Object) {
  9. this.way = leve;
  10. }
  11. getResult(){
  12. return this.way.calculate(this.base);
  13. }
  14. }
业务代码(用来输出结果的代码)

</>复制代码

  1. let calculater = new Calculate(); //实例化生成可调用对象
  2. calculater.setBase(1000); //设置计算基础
  3. calculater.setLeve( new L1() ); //设置计算的方式
  4. console.log(calculater.getResult()); //get类方法,输出最后的结果
小结

从以上代码可看出,扩展可在条件代码中扩展。保持了代码的高扩展和高可维护性。

一个很好的决策模式的代码

html代码

</>复制代码

  1. 用户名:
  2. 密码:
  3. 手机号码:

typescript代码

</>复制代码

  1. /* 定义检查表单的规则 */
  2. namespace RuleList{
  3. export const Rules: any = {
  4. "isNotEmpty": function (value: any, errMsg: string) {
  5. console.log(11);
  6. if (value === "") return errMsg;
  7. },
  8. "minLength": function (value: any, minLength: number, errMsg: string) {
  9. console.log(22);
  10. if (value.length < minLength) return errMsg;
  11. },
  12. "isMobile": function (value: any, errMsg: string) {
  13. console.log(33);
  14. if (!/^1[3|5|8][0-9]{9}$/.test(value)) return errMsg;
  15. }
  16. }
  17. }
  18. /* 定义检查表单的方法类:add():添加检查的规则; start():开始检查 */
  19. class Validator {
  20. cache: object[] = [];
  21. add(dom: any, rule: string, errMsg: string) {
  22. let arr: any = rule.split(":");
  23. this.cache.push(function () {
  24. let whichRule: string = arr.shift();
  25. arr.unshift(dom.value);
  26. arr.push(errMsg);
  27. return RuleList.Rules[whichRule].apply(dom, arr);
  28. });
  29. };
  30. start() {
  31. for (let i: number = 0, func: any; i < this.cache.length; i++) {
  32. func = this.cache[i];
  33. let msg = func();
  34. if (msg) return msg; //如果有返回值说明验证没有通过
  35. }
  36. }
  37. }
  38. /* 策略模式的表单校验 */
  39. let regForm = document.querySelector("form");
  40. let usr:any = document.querySelector("input[type=text]:first-of-type");
  41. let pwd:any = document.querySelector("input[type=password]");
  42. let phone:any = document.querySelector("#ph");
  43. /* 检查表单的函数 ->1.1 */
  44. let ValidataFunc = function(){
  45. let validator = new Validator();
  46. validator.add(usr, "isNotEmpty","用户名为空");
  47. validator.add(pwd, "isNotEmpty", "密码为空");
  48. validator.add(pwd, "minLength:6", "密码小于6位");
  49. validator.add(phone,"isMobile","号码不是手机号码");
  50. let msg = validator.start();
  51. return msg;
  52. }
  53. /* 检查表单的函数 ->1. */
  54. if( regForm ){
  55. regForm.onsubmit = function(){
  56. let errMsg = ValidataFunc();
  57. if( errMsg ){
  58. alert(errMsg);
  59. return false;
  60. }
  61. }
  62. }

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

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

相关文章

  • PHP面试常考设计模式——策略模式

    摘要:策略模式介绍策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。使用策略模式的好处策略模式提供了管理相关的算法族的办法。使用策略模式可以避免使用多重条件转移语句。 你好,是我琉忆,PHP程序员面试笔试系列图书的作者。 本周(2019.3.11至3.15)的一三五更新的文章如下: 周一:PHP面试常考之设计模式——工...

    Drinkey 评论0 收藏0
  • JavaScript设计模式策略模式

    摘要:设计模式与开发实践读书笔记。策略模式可以有效避免多重条件选择语句。当然,策略模式也有一些缺点增加了许多策略类或者策略对象。要使用策略模式,必须了解所有的,违反了最少知识原则。至此,回家咯附设计模式之发布订阅模式观察者模式 《JavaScript设计模式与开发实践》读书笔记。这本书挺好的,推荐。 俗话说,条条大路通罗马。在现实生活中,我们可以采用很多方法实现同一个目标。比如我们先定个小目...

    go4it 评论0 收藏0
  • 设计模式策略模式

    摘要:一定义定义维基百科策略模式作爲一種軟件設計模式,指對象有某個行爲,但是在不同的場景中,該行爲有不同的實現算法。二策略模式图我们看看策略模式是有怎样设计结构的。如中创建线程池,线程池任务满时,对提交的任务做处理就使用了策略模式。以前完整的看过《大话设计模式》,虽然完整看过,也做过笔记,但现在依然很多已经很模糊。这段时间趁着离职,有时间,打算重新过一遍,该篇将介绍策略模式。一、定义定义(维基百科...

    番茄西红柿 评论0 收藏0
  • 设计模式策略模式

    摘要:一定义定义维基百科策略模式作爲一種軟件設計模式,指對象有某個行爲,但是在不同的場景中,該行爲有不同的實現算法。二策略模式图我们看看策略模式是有怎样设计结构的。如中创建线程池,线程池任务满时,对提交的任务做处理就使用了策略模式。以前完整的看过《大话设计模式》,虽然完整看过,也做过笔记,但现在依然很多已经很模糊。这段时间趁着离职,有时间,打算重新过一遍,该篇将介绍策略模式。一、定义定义(维基百科...

    番茄西红柿 评论0 收藏0
  • 设计模式策略模式

    摘要:一定义定义维基百科策略模式作爲一種軟件設計模式,指對象有某個行爲,但是在不同的場景中,該行爲有不同的實現算法。二策略模式图我们看看策略模式是有怎样设计结构的。如中创建线程池,线程池任务满时,对提交的任务做处理就使用了策略模式。以前完整的看过《大话设计模式》,虽然完整看过,也做过笔记,但现在依然很多已经很模糊。这段时间趁着离职,有时间,打算重新过一遍,该篇将介绍策略模式。一、定义定义(维基百科...

    MangoGoing 评论0 收藏0

发表评论

0条评论

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